質問編集履歴
4
とりあえず原因が分かったので削除しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,397 +1,3 @@
|
|
1
|
-
# **追記その2**
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
**gh640**さんが仰っていたコマンドを実行しました!ありがとうございます!
|
6
|
-
|
7
|
-
**centOSのPython**と**Djangoのインタラクティブシェル**の実行結果です。
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
## CentOS上のPython3.6.5
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
### CASE **A**
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
```python
|
20
|
-
|
21
|
-
>>> import os, sys, json
|
22
|
-
|
23
|
-
>>> path = 'media/movies'
|
24
|
-
|
25
|
-
>>> result = os.listdir(path)
|
26
|
-
|
27
|
-
>>> print(result)
|
28
|
-
|
29
|
-
['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
|
30
|
-
|
31
|
-
>>> print(json.dumps(result, ensure_ascii=False))
|
32
|
-
|
33
|
-
["テスト1", "test1.mp4", "test2.mp4", "テスト2", "テスト4", "テスト3"]
|
34
|
-
|
35
|
-
```
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
### CASE **B**
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
```python
|
44
|
-
|
45
|
-
>>> import os, sys, json
|
46
|
-
|
47
|
-
>>> result = os.listdir(b'media/movies')
|
48
|
-
|
49
|
-
>>> entries = [e.decode(sys.getfilesystemencoding()) for e in result]
|
50
|
-
|
51
|
-
>>> print(entries)
|
52
|
-
|
53
|
-
['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
|
54
|
-
|
55
|
-
>>> print(json.dumps(result, ensure_ascii=False))
|
56
|
-
|
57
|
-
Traceback (most recent call last):
|
58
|
-
|
59
|
-
File "<stdin>", line 1, in <module>
|
60
|
-
|
61
|
-
File "/usr/lib64/python3.6/json/__init__.py", line 238, in dumps
|
62
|
-
|
63
|
-
**kw).encode(obj)
|
64
|
-
|
65
|
-
File "/usr/lib64/python3.6/json/encoder.py", line 199, in encode
|
66
|
-
|
67
|
-
chunks = self.iterencode(o, _one_shot=True)
|
68
|
-
|
69
|
-
File "/usr/lib64/python3.6/json/encoder.py", line 257, in iterencode
|
70
|
-
|
71
|
-
return _iterencode(o, 0)
|
72
|
-
|
73
|
-
File "/usr/lib64/python3.6/json/encoder.py", line 180, in default
|
74
|
-
|
75
|
-
o.__class__.__name__)
|
76
|
-
|
77
|
-
TypeError: Object of type 'bytes' is not JSON serializable
|
78
|
-
|
79
|
-
```
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
## django上のPython(`py manage.py shell`)
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
### CASE **A**
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
```python
|
92
|
-
|
93
|
-
>>> import os, sys, json
|
94
|
-
|
95
|
-
>>> path = 'media/movies'
|
96
|
-
|
97
|
-
>>> result = os.listdir(path)
|
98
|
-
|
99
|
-
>>> print(result)
|
100
|
-
|
101
|
-
['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
|
102
|
-
|
103
|
-
>>> print(json.dumps(result, ensure_ascii=False))
|
104
|
-
|
105
|
-
["テスト1", "test1.mp4", "test2.mp4", "テスト2", "テスト4", "テスト3"]
|
106
|
-
|
107
|
-
```
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
### CASE **B**
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
```python
|
116
|
-
|
117
|
-
>>> import os, sys, json
|
118
|
-
|
119
|
-
>>> result = os.listdir(b'media/movies')
|
120
|
-
|
121
|
-
>>> entries = [e.decode(sys.getfilesystemencoding()) for e in result]
|
122
|
-
|
123
|
-
>>> print(entries)
|
124
|
-
|
125
|
-
['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
|
126
|
-
|
127
|
-
>>> print(json.dumps(result, ensure_ascii=False))
|
128
|
-
|
129
|
-
Traceback (most recent call last):
|
130
|
-
|
131
|
-
File "<console>", line 1, in <module>
|
132
|
-
|
133
|
-
File "/usr/lib64/python3.6/json/__init__.py", line 238, in dumps
|
134
|
-
|
135
|
-
**kw).encode(obj)
|
136
|
-
|
137
|
-
File "/usr/lib64/python3.6/json/encoder.py", line 199, in encode
|
138
|
-
|
139
|
-
chunks = self.iterencode(o, _one_shot=True)
|
140
|
-
|
141
|
-
File "/usr/lib64/python3.6/json/encoder.py", line 257, in iterencode
|
142
|
-
|
143
|
-
return _iterencode(o, 0)
|
144
|
-
|
145
|
-
File "/usr/lib64/python3.6/json/encoder.py", line 180, in default
|
146
|
-
|
147
|
-
o.__class__.__name__)
|
148
|
-
|
149
|
-
TypeError: Object of type 'bytes' is not JSON serializable
|
150
|
-
|
151
|
-
```
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
以上になります!通常の`shell`と`django上のshell`にて実行しましたが、**同じ結果**となりました。
|
156
|
-
|
157
|
-
ついでに試しにやってみたんですが、`os.listdir('media/movies')`の結果を一つずつ`encode()`してから`deocde()`した結果も貼っておきます。
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
### os上のpython3.6.5
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
```python
|
166
|
-
|
167
|
-
>>> import os, sys, json
|
168
|
-
|
169
|
-
>>> result = os.listdir('media/movies')
|
170
|
-
|
171
|
-
>>> json.dumps([i.encode('utf-8').decode('utf-8') for i in result])
|
172
|
-
|
173
|
-
'["\u30c6\u30b9\u30c81", "test1.mp4", "test2.mp4", "\u30c6\u30b9\u30c82", "\u30c6\u30b9\u30c84", "\u30c6\u30b9\u30c83"]'
|
174
|
-
|
175
|
-
```
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
### django(py manage.py shell)
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
```python
|
184
|
-
|
185
|
-
>>> import os, sys, json
|
186
|
-
|
187
|
-
>>> result = os.listdir('media/movies')
|
188
|
-
|
189
|
-
>>> json.dumps([i.encode('utf-8').decode('utf-8') for i in result])
|
190
|
-
|
191
|
-
'["\u30c6\u30b9\u30c81", "test1.mp4", "test2.mp4", "\u30c6\u30b9\u30c82", "\u30c6\u30b9\u30c84", "\u30c6\u30b9\u30c83"]'
|
192
|
-
|
193
|
-
```
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
###### シェルだと普通にエンコード出来てるのに、なぜdjnagoだとサロゲートペアが云々...
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
# **追記**
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
皆様、親切なご回答有り難うございます!ご指摘の通りにCentOS7の`locale`や`LANG`を確認してみました。
|
206
|
-
|
207
|
-
また、localeが対応している文字コードについても記載しておきます。
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
```bash
|
212
|
-
|
213
|
-
[kiwi@118-27-32-60 ~/app/archer]$ locale -a | grep ja
|
214
|
-
|
215
|
-
ja_JP
|
216
|
-
|
217
|
-
ja_JP.eucjp
|
218
|
-
|
219
|
-
ja_JP.ujis
|
220
|
-
|
221
|
-
ja_JP.utf8
|
222
|
-
|
223
|
-
japanese
|
224
|
-
|
225
|
-
japanese.euc
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
[kiwi@118-27-32-60 ~/app/archer]$ locale -a | grep c.utf8
|
230
|
-
|
231
|
-
[kiwi@118-27-32-60 ~/app/archer]$ locale -a | grep en_US.utf8
|
232
|
-
|
233
|
-
en_US.utf8
|
234
|
-
|
235
|
-
```
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
#### 環境変数 `LANG`
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
```bash
|
244
|
-
|
245
|
-
[kiwi@118-27-32-60 ~]$ export | grep LANG
|
246
|
-
|
247
|
-
declare -x LANG="ja_JP.utf8"
|
248
|
-
|
249
|
-
```
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
#### `locale`コマンド
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
```bash
|
258
|
-
|
259
|
-
[kiwi@118-27-32-60 ~]$ locale
|
260
|
-
|
261
|
-
LANG=ja_JP.utf8
|
262
|
-
|
263
|
-
LC_CTYPE="ja_JP.utf8"
|
264
|
-
|
265
|
-
LC_NUMERIC="ja_JP.utf8"
|
266
|
-
|
267
|
-
LC_TIME="ja_JP.utf8"
|
268
|
-
|
269
|
-
LC_COLLATE="ja_JP.utf8"
|
270
|
-
|
271
|
-
LC_MONETARY="ja_JP.utf8"
|
272
|
-
|
273
|
-
LC_MESSAGES="ja_JP.utf8"
|
274
|
-
|
275
|
-
LC_PAPER="ja_JP.utf8"
|
276
|
-
|
277
|
-
LC_NAME="ja_JP.utf8"
|
278
|
-
|
279
|
-
LC_ADDRESS="ja_JP.utf8"
|
280
|
-
|
281
|
-
LC_TELEPHONE="ja_JP.utf8"
|
282
|
-
|
283
|
-
LC_MEASUREMENT="ja_JP.utf8"
|
284
|
-
|
285
|
-
LC_IDENTIFICATION="ja_JP.utf8"
|
286
|
-
|
287
|
-
LC_ALL=
|
288
|
-
|
289
|
-
```
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
となりました。ご指摘の通り、`c.utf8`や`en_US.utf8`に修正して`reboot`してみたりしましたが、サーバーが英語になるだけで相変わらず文字化けしていました...。
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
#### `localectl`コマンド
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
```bash
|
302
|
-
|
303
|
-
[kiwi@118-27-32-60 ~]$ localectl status
|
304
|
-
|
305
|
-
System Locale: LANG=ja_JP.utf8
|
306
|
-
|
307
|
-
VC Keymap: jp
|
308
|
-
|
309
|
-
X11 Layout: jp
|
310
|
-
|
311
|
-
```
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
また、**gh640**さんのご指摘に乗っ取り、`HttpResponse(json.dumps())`でレスポンスしてみましたが、`500`エラーが返ってきます(涙
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
```python
|
320
|
-
|
321
|
-
result = os.listdir(path)
|
322
|
-
|
323
|
-
return HttpResponse(json.dumps(result, ensure_ascii=False))
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
>>>
|
328
|
-
|
329
|
-
UnicodeEncodeError at /api/get_list
|
330
|
-
|
331
|
-
'utf-8' codec can't encode characters in position 2-10: surrogates not allowed
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
Server time: 驥�, 23 11譛� 2018 19:41:05 +0900
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
Exception Type: UnicodeEncodeError at /api/get_list
|
340
|
-
|
341
|
-
Exception Value: 'utf-8' codec can't encode characters in position 2-10: surrogates not allowed
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
wsgi.errors = <_io.TextIOWrapper name='<wsgi.errors>' encoding='utf-8'>
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
Settings:
|
350
|
-
|
351
|
-
DEFAULT_CHARSET = 'utf-8'
|
352
|
-
|
353
|
-
DEFAULT_CONTENT_TYPE = 'text/html'
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
LANGUAGES = [('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmテ・l'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')]
|
358
|
-
|
359
|
-
LANGUAGES_BIDI = ['he', 'ar', 'fa', 'ur']
|
360
|
-
|
361
|
-
LANGUAGE_CODE = 'ja'
|
362
|
-
|
363
|
-
LANGUAGE_COOKIE_AGE = None
|
364
|
-
|
365
|
-
LANGUAGE_COOKIE_DOMAIN = None
|
366
|
-
|
367
|
-
LANGUAGE_COOKIE_NAME = 'django_language'
|
368
|
-
|
369
|
-
LANGUAGE_COOKIE_PATH = '/'
|
370
|
-
|
371
|
-
TIME_ZONE = 'Asia/Tokyo'
|
372
|
-
|
373
|
-
USE_I18N = True
|
374
|
-
|
375
|
-
USE_L10N = True
|
376
|
-
|
377
|
-
USE_THOUSAND_SEPARATOR = False
|
378
|
-
|
379
|
-
USE_TZ = True
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
```
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
`'utf-8' codec can't encode characters in position 2-10: surrogates not allowed`とあるので、やはりサロゲートペア?の問題なのでしょうか?しかし、ただ`list`を返しているだけなのですが...ファイル名の文字コードがそもそもおかしいのかな、とも思い`nkf`コマンドで変換なども試してみましたが、**既にUTF-8**です...と返されて泣きました。
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
---
|
392
|
-
|
393
|
-
|
394
|
-
|
395
1
|
## 概要
|
396
2
|
|
397
3
|
|
3
追記その2を追加しました。centosのpythonシェルとdjangoのシェルでCASE A CASE Bをそれぞれ実行しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,3 +1,203 @@
|
|
1
|
+
# **追記その2**
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
**gh640**さんが仰っていたコマンドを実行しました!ありがとうございます!
|
6
|
+
|
7
|
+
**centOSのPython**と**Djangoのインタラクティブシェル**の実行結果です。
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
## CentOS上のPython3.6.5
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
### CASE **A**
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
```python
|
20
|
+
|
21
|
+
>>> import os, sys, json
|
22
|
+
|
23
|
+
>>> path = 'media/movies'
|
24
|
+
|
25
|
+
>>> result = os.listdir(path)
|
26
|
+
|
27
|
+
>>> print(result)
|
28
|
+
|
29
|
+
['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
|
30
|
+
|
31
|
+
>>> print(json.dumps(result, ensure_ascii=False))
|
32
|
+
|
33
|
+
["テスト1", "test1.mp4", "test2.mp4", "テスト2", "テスト4", "テスト3"]
|
34
|
+
|
35
|
+
```
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
### CASE **B**
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
```python
|
44
|
+
|
45
|
+
>>> import os, sys, json
|
46
|
+
|
47
|
+
>>> result = os.listdir(b'media/movies')
|
48
|
+
|
49
|
+
>>> entries = [e.decode(sys.getfilesystemencoding()) for e in result]
|
50
|
+
|
51
|
+
>>> print(entries)
|
52
|
+
|
53
|
+
['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
|
54
|
+
|
55
|
+
>>> print(json.dumps(result, ensure_ascii=False))
|
56
|
+
|
57
|
+
Traceback (most recent call last):
|
58
|
+
|
59
|
+
File "<stdin>", line 1, in <module>
|
60
|
+
|
61
|
+
File "/usr/lib64/python3.6/json/__init__.py", line 238, in dumps
|
62
|
+
|
63
|
+
**kw).encode(obj)
|
64
|
+
|
65
|
+
File "/usr/lib64/python3.6/json/encoder.py", line 199, in encode
|
66
|
+
|
67
|
+
chunks = self.iterencode(o, _one_shot=True)
|
68
|
+
|
69
|
+
File "/usr/lib64/python3.6/json/encoder.py", line 257, in iterencode
|
70
|
+
|
71
|
+
return _iterencode(o, 0)
|
72
|
+
|
73
|
+
File "/usr/lib64/python3.6/json/encoder.py", line 180, in default
|
74
|
+
|
75
|
+
o.__class__.__name__)
|
76
|
+
|
77
|
+
TypeError: Object of type 'bytes' is not JSON serializable
|
78
|
+
|
79
|
+
```
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
## django上のPython(`py manage.py shell`)
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
### CASE **A**
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
```python
|
92
|
+
|
93
|
+
>>> import os, sys, json
|
94
|
+
|
95
|
+
>>> path = 'media/movies'
|
96
|
+
|
97
|
+
>>> result = os.listdir(path)
|
98
|
+
|
99
|
+
>>> print(result)
|
100
|
+
|
101
|
+
['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
|
102
|
+
|
103
|
+
>>> print(json.dumps(result, ensure_ascii=False))
|
104
|
+
|
105
|
+
["テスト1", "test1.mp4", "test2.mp4", "テスト2", "テスト4", "テスト3"]
|
106
|
+
|
107
|
+
```
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
### CASE **B**
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
```python
|
116
|
+
|
117
|
+
>>> import os, sys, json
|
118
|
+
|
119
|
+
>>> result = os.listdir(b'media/movies')
|
120
|
+
|
121
|
+
>>> entries = [e.decode(sys.getfilesystemencoding()) for e in result]
|
122
|
+
|
123
|
+
>>> print(entries)
|
124
|
+
|
125
|
+
['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
|
126
|
+
|
127
|
+
>>> print(json.dumps(result, ensure_ascii=False))
|
128
|
+
|
129
|
+
Traceback (most recent call last):
|
130
|
+
|
131
|
+
File "<console>", line 1, in <module>
|
132
|
+
|
133
|
+
File "/usr/lib64/python3.6/json/__init__.py", line 238, in dumps
|
134
|
+
|
135
|
+
**kw).encode(obj)
|
136
|
+
|
137
|
+
File "/usr/lib64/python3.6/json/encoder.py", line 199, in encode
|
138
|
+
|
139
|
+
chunks = self.iterencode(o, _one_shot=True)
|
140
|
+
|
141
|
+
File "/usr/lib64/python3.6/json/encoder.py", line 257, in iterencode
|
142
|
+
|
143
|
+
return _iterencode(o, 0)
|
144
|
+
|
145
|
+
File "/usr/lib64/python3.6/json/encoder.py", line 180, in default
|
146
|
+
|
147
|
+
o.__class__.__name__)
|
148
|
+
|
149
|
+
TypeError: Object of type 'bytes' is not JSON serializable
|
150
|
+
|
151
|
+
```
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
以上になります!通常の`shell`と`django上のshell`にて実行しましたが、**同じ結果**となりました。
|
156
|
+
|
157
|
+
ついでに試しにやってみたんですが、`os.listdir('media/movies')`の結果を一つずつ`encode()`してから`deocde()`した結果も貼っておきます。
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
### os上のpython3.6.5
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
```python
|
166
|
+
|
167
|
+
>>> import os, sys, json
|
168
|
+
|
169
|
+
>>> result = os.listdir('media/movies')
|
170
|
+
|
171
|
+
>>> json.dumps([i.encode('utf-8').decode('utf-8') for i in result])
|
172
|
+
|
173
|
+
'["\u30c6\u30b9\u30c81", "test1.mp4", "test2.mp4", "\u30c6\u30b9\u30c82", "\u30c6\u30b9\u30c84", "\u30c6\u30b9\u30c83"]'
|
174
|
+
|
175
|
+
```
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
### django(py manage.py shell)
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
```python
|
184
|
+
|
185
|
+
>>> import os, sys, json
|
186
|
+
|
187
|
+
>>> result = os.listdir('media/movies')
|
188
|
+
|
189
|
+
>>> json.dumps([i.encode('utf-8').decode('utf-8') for i in result])
|
190
|
+
|
191
|
+
'["\u30c6\u30b9\u30c81", "test1.mp4", "test2.mp4", "\u30c6\u30b9\u30c82", "\u30c6\u30b9\u30c84", "\u30c6\u30b9\u30c83"]'
|
192
|
+
|
193
|
+
```
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
###### シェルだと普通にエンコード出来てるのに、なぜdjnagoだとサロゲートペアが云々...
|
198
|
+
|
199
|
+
|
200
|
+
|
1
201
|
# **追記**
|
2
202
|
|
3
203
|
|
@@ -144,22 +344,6 @@
|
|
144
344
|
|
145
345
|
wsgi.errors = <_io.TextIOWrapper name='<wsgi.errors>' encoding='utf-8'>
|
146
346
|
|
147
|
-
wsgi.file_wrapper = ''
|
148
|
-
|
149
|
-
wsgi.input = <mod_wsgi.Input object at 0x7f221e757c70>
|
150
|
-
|
151
|
-
wsgi.input_terminated = True
|
152
|
-
|
153
|
-
wsgi.multiprocess = True
|
154
|
-
|
155
|
-
wsgi.multithread = True
|
156
|
-
|
157
|
-
wsgi.run_once = False
|
158
|
-
|
159
|
-
wsgi.url_scheme = 'https'
|
160
|
-
|
161
|
-
wsgi.version = '(1, 0)'
|
162
|
-
|
163
347
|
|
164
348
|
|
165
349
|
Settings:
|
2
修正漏れの追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -90,7 +90,7 @@
|
|
90
90
|
|
91
91
|
|
92
92
|
|
93
|
-
となりました。ご指摘の通り、`
|
93
|
+
となりました。ご指摘の通り、`c.utf8`や`en_US.utf8`に修正して`reboot`してみたりしましたが、サーバーが英語になるだけで相変わらず文字化けしていました...。
|
94
94
|
|
95
95
|
|
96
96
|
|
1
サーバー側の文字コードについての追記、追加で試したことを記載
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,3 +1,217 @@
|
|
1
|
+
# **追記**
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
皆様、親切なご回答有り難うございます!ご指摘の通りにCentOS7の`locale`や`LANG`を確認してみました。
|
6
|
+
|
7
|
+
また、localeが対応している文字コードについても記載しておきます。
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
```bash
|
12
|
+
|
13
|
+
[kiwi@118-27-32-60 ~/app/archer]$ locale -a | grep ja
|
14
|
+
|
15
|
+
ja_JP
|
16
|
+
|
17
|
+
ja_JP.eucjp
|
18
|
+
|
19
|
+
ja_JP.ujis
|
20
|
+
|
21
|
+
ja_JP.utf8
|
22
|
+
|
23
|
+
japanese
|
24
|
+
|
25
|
+
japanese.euc
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
[kiwi@118-27-32-60 ~/app/archer]$ locale -a | grep c.utf8
|
30
|
+
|
31
|
+
[kiwi@118-27-32-60 ~/app/archer]$ locale -a | grep en_US.utf8
|
32
|
+
|
33
|
+
en_US.utf8
|
34
|
+
|
35
|
+
```
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
#### 環境変数 `LANG`
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
```bash
|
44
|
+
|
45
|
+
[kiwi@118-27-32-60 ~]$ export | grep LANG
|
46
|
+
|
47
|
+
declare -x LANG="ja_JP.utf8"
|
48
|
+
|
49
|
+
```
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
#### `locale`コマンド
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
```bash
|
58
|
+
|
59
|
+
[kiwi@118-27-32-60 ~]$ locale
|
60
|
+
|
61
|
+
LANG=ja_JP.utf8
|
62
|
+
|
63
|
+
LC_CTYPE="ja_JP.utf8"
|
64
|
+
|
65
|
+
LC_NUMERIC="ja_JP.utf8"
|
66
|
+
|
67
|
+
LC_TIME="ja_JP.utf8"
|
68
|
+
|
69
|
+
LC_COLLATE="ja_JP.utf8"
|
70
|
+
|
71
|
+
LC_MONETARY="ja_JP.utf8"
|
72
|
+
|
73
|
+
LC_MESSAGES="ja_JP.utf8"
|
74
|
+
|
75
|
+
LC_PAPER="ja_JP.utf8"
|
76
|
+
|
77
|
+
LC_NAME="ja_JP.utf8"
|
78
|
+
|
79
|
+
LC_ADDRESS="ja_JP.utf8"
|
80
|
+
|
81
|
+
LC_TELEPHONE="ja_JP.utf8"
|
82
|
+
|
83
|
+
LC_MEASUREMENT="ja_JP.utf8"
|
84
|
+
|
85
|
+
LC_IDENTIFICATION="ja_JP.utf8"
|
86
|
+
|
87
|
+
LC_ALL=
|
88
|
+
|
89
|
+
```
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
となりました。ご指摘の通り、`C.utf8`や`en_US.utf8`
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
#### `localectl`コマンド
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
```bash
|
102
|
+
|
103
|
+
[kiwi@118-27-32-60 ~]$ localectl status
|
104
|
+
|
105
|
+
System Locale: LANG=ja_JP.utf8
|
106
|
+
|
107
|
+
VC Keymap: jp
|
108
|
+
|
109
|
+
X11 Layout: jp
|
110
|
+
|
111
|
+
```
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
また、**gh640**さんのご指摘に乗っ取り、`HttpResponse(json.dumps())`でレスポンスしてみましたが、`500`エラーが返ってきます(涙
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
```python
|
120
|
+
|
121
|
+
result = os.listdir(path)
|
122
|
+
|
123
|
+
return HttpResponse(json.dumps(result, ensure_ascii=False))
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
>>>
|
128
|
+
|
129
|
+
UnicodeEncodeError at /api/get_list
|
130
|
+
|
131
|
+
'utf-8' codec can't encode characters in position 2-10: surrogates not allowed
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
Server time: 驥�, 23 11譛� 2018 19:41:05 +0900
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
Exception Type: UnicodeEncodeError at /api/get_list
|
140
|
+
|
141
|
+
Exception Value: 'utf-8' codec can't encode characters in position 2-10: surrogates not allowed
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
wsgi.errors = <_io.TextIOWrapper name='<wsgi.errors>' encoding='utf-8'>
|
146
|
+
|
147
|
+
wsgi.file_wrapper = ''
|
148
|
+
|
149
|
+
wsgi.input = <mod_wsgi.Input object at 0x7f221e757c70>
|
150
|
+
|
151
|
+
wsgi.input_terminated = True
|
152
|
+
|
153
|
+
wsgi.multiprocess = True
|
154
|
+
|
155
|
+
wsgi.multithread = True
|
156
|
+
|
157
|
+
wsgi.run_once = False
|
158
|
+
|
159
|
+
wsgi.url_scheme = 'https'
|
160
|
+
|
161
|
+
wsgi.version = '(1, 0)'
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
Settings:
|
166
|
+
|
167
|
+
DEFAULT_CHARSET = 'utf-8'
|
168
|
+
|
169
|
+
DEFAULT_CONTENT_TYPE = 'text/html'
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
LANGUAGES = [('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmテ・l'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')]
|
174
|
+
|
175
|
+
LANGUAGES_BIDI = ['he', 'ar', 'fa', 'ur']
|
176
|
+
|
177
|
+
LANGUAGE_CODE = 'ja'
|
178
|
+
|
179
|
+
LANGUAGE_COOKIE_AGE = None
|
180
|
+
|
181
|
+
LANGUAGE_COOKIE_DOMAIN = None
|
182
|
+
|
183
|
+
LANGUAGE_COOKIE_NAME = 'django_language'
|
184
|
+
|
185
|
+
LANGUAGE_COOKIE_PATH = '/'
|
186
|
+
|
187
|
+
TIME_ZONE = 'Asia/Tokyo'
|
188
|
+
|
189
|
+
USE_I18N = True
|
190
|
+
|
191
|
+
USE_L10N = True
|
192
|
+
|
193
|
+
USE_THOUSAND_SEPARATOR = False
|
194
|
+
|
195
|
+
USE_TZ = True
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
```
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
`'utf-8' codec can't encode characters in position 2-10: surrogates not allowed`とあるので、やはりサロゲートペア?の問題なのでしょうか?しかし、ただ`list`を返しているだけなのですが...ファイル名の文字コードがそもそもおかしいのかな、とも思い`nkf`コマンドで変換なども試してみましたが、**既にUTF-8**です...と返されて泣きました。
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
---
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
## 概要
|
212
|
+
|
213
|
+
|
214
|
+
|
1
215
|
POSTで指定したディレクトリ内のファイル一覧を返すAPIをDjangoで構築しています。
|
2
216
|
|
3
217
|
どうも、日本語を含むとファイル名が全て文字化けしてしまうようです。
|