@@ -110,7 +110,8 @@ function! s:decode(json, ...) abort
110
110
\ ' use_token' : 0 ,
111
111
\ ' allow_nan' : 1 ,
112
112
\} , get (a: 000 , 0 , {}))
113
- let json = join (split (a: json , " \n " ), ' ' )
113
+ let json = iconv (a: json , ' utf-8' , &encoding )
114
+ let json = join (split (json, " \n " ), ' ' )
114
115
let json = substitute (json, ' \\u34;' , ' \\"' , ' g' )
115
116
let json = substitute (json, ' \\u\(\x\x\x\x\)' , ' \=s:string.nr2enc_char("0x".submatch(1))' , ' g' )
116
117
if settings.allow_nan
@@ -138,13 +139,19 @@ function! s:encode(val, ...) abort
138
139
let settings = extend ({
139
140
\ ' indent' : 0 ,
140
141
\ ' allow_nan' : 1 ,
142
+ \ ' from_encoding' : &encoding ,
141
143
\} , get (a: 000 , 0 , {})
142
144
\)
145
+ return s: _encode (a: val , settings)
146
+ endfunction
147
+
148
+ function ! s: _encode (val, settings) abort
143
149
let t = type (a: val )
144
150
if t == 0
145
151
return a: val
146
152
elseif t == 1
147
- let s = substitute (a: val , ' [\x01-\x1f\\"]' , ' \=s:control_chars[submatch(0)]' , ' g' )
153
+ let s = iconv (a: val , a: settings .from_encoding, ' utf-8' )
154
+ let s = substitute (s , ' [\x01-\x1f\\"]' , ' \=s:control_chars[submatch(0)]' , ' g' )
148
155
return ' "' . s . ' "'
149
156
elseif t == 2
150
157
if s: const .true == a: val
@@ -158,12 +165,12 @@ function! s:encode(val, ...) abort
158
165
return string (a: val )
159
166
endif
160
167
elseif t == 3
161
- return s: _encode_list (a: val , settings)
168
+ return s: _encode_list (a: val , a: settings )
162
169
elseif t == 4
163
- return s: _encode_dict (a: val , settings)
170
+ return s: _encode_dict (a: val , a: settings )
164
171
elseif t == 5
165
172
let val = string (a: val )
166
- if settings.allow_nan
173
+ if a: settings .allow_nan
167
174
let val = get (s: float_constants , val, val)
168
175
elseif has_key (s: float_constants , val)
169
176
throw ' vital: Web.JSON: Invalid float value: ' . val
@@ -181,7 +188,7 @@ function! s:_encode_list(val, settings) abort
181
188
if empty (a: val )
182
189
return ' []'
183
190
elseif ! a: settings .indent
184
- let encoded_candidates = map (copy (a: val ), ' s:encode (v:val, a:settings)' )
191
+ let encoded_candidates = map (copy (a: val ), ' s:_encode (v:val, a:settings)' )
185
192
return printf (' [%s]' , join (encoded_candidates, ' ,' ))
186
193
else
187
194
let previous_indent = get (a: settings , ' _previous_indent' )
@@ -191,7 +198,7 @@ function! s:_encode_list(val, settings) abort
191
198
\} )
192
199
let encoded_candidates = map (
193
200
\ copy (a: val ),
194
- \ printf (' ' ' %s'' . s:encode (v:val, ns)' , repeat (' ' , indent )),
201
+ \ printf (' ' ' %s'' . s:_encode (v:val, ns)' , repeat (' ' , indent )),
195
202
\)
196
203
return printf (
197
204
\ " [\n %s\n %s]" ,
@@ -208,7 +215,7 @@ function! s:_encode_dict(val, settings) abort
208
215
return ' {}'
209
216
elseif ! a: settings .indent
210
217
let encoded_candidates = map (keys (a: val ),
211
- \ ' s:encode (v:val, a:settings) . '' :'' . s:encode (a:val[v:val], a:settings)'
218
+ \ ' s:_encode (v:val, a:settings) . '' :'' . s:_encode (a:val[v:val], a:settings)'
212
219
\)
213
220
return printf (' {%s}' , join (encoded_candidates, ' ,' ))
214
221
else
@@ -219,7 +226,7 @@ function! s:_encode_dict(val, settings) abort
219
226
\} )
220
227
let encoded_candidates = map (keys (a: val ),
221
228
\ printf (
222
- \ ' ' ' %s'' . s:encode (v:val, ns) . '' : '' . s:encode (a:val[v:val], ns)' ,
229
+ \ ' ' ' %s'' . s:_encode (v:val, ns) . '' : '' . s:_encode (a:val[v:val], ns)' ,
223
230
\ repeat (' ' , indent ),
224
231
\ ),
225
232
\)
0 commit comments