回答編集履歴
6
誤字修正
test
CHANGED
@@ -182,4 +182,4 @@
|
|
182
182
|
|
183
183
|
|
184
184
|
|
185
|
-
大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたり
|
185
|
+
大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたりディスクの読み書きやネットワーク、popen(),system()などで外部コマンドを呼び出す時が外の世界になります。その時だけエンコードに注意しましょう。Pythonの内側では、出来る限り文字列はUnicodeオブジェクトのまま、バイト列はbytesのままにすれば、うまく行くようにPythonのライブラリが設計されているからです。今回のファイル名も外界になることは盲点で、僕も勉強になりました。
|
5
コメント追加
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
次の行を
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
次のように変更して、ファイル名のエンコーディングを明示的に指定します。これで動くと思いますし、環境依存にさせないためには、むしろ積極的に指定する方が安全
|
15
|
+
次のように変更して、ファイル名のエンコーディングを明示的に指定します。これで動くと思いますし、環境依存にさせないためには、むしろ積極的に指定する方が安全です。
|
16
16
|
|
17
17
|
|
18
18
|
|
@@ -179,3 +179,7 @@
|
|
179
179
|
$ LANG=ja_JP.UTF-8 python3 test.py
|
180
180
|
|
181
181
|
```
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたりでディスクの読み書きやネットワーク、popen(),system()などで外部コマンドを呼び出す時が外の世界になります。その時だけエンコードに注意しましょう。Pythonの内側では、出来る限り文字列はUnicodeオブジェクトのまま、バイト列はbytesのままにすれば、うまく行くようにPythonのライブラリが設計されているからです。今回のファイル名も外界になることは盲点で、僕も勉強になりました。
|
4
誤字
test
CHANGED
@@ -90,7 +90,7 @@
|
|
90
90
|
|
91
91
|
|
92
92
|
|
93
|
-
ちなみに端末の環境は次の通り。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
|
93
|
+
ちなみに端末の環境は次の通り。日本語の設定をするとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
|
94
94
|
|
95
95
|
|
96
96
|
|
3
説明を追加。くどいかも。
test
CHANGED
@@ -132,7 +132,7 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
-
言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。
|
135
|
+
言語はen_USでもエンコーディングはUTF-8なので、修正前のコードを試してみるとうまくいきます。
|
136
136
|
|
137
137
|
|
138
138
|
|
@@ -150,7 +150,7 @@
|
|
150
150
|
|
151
151
|
|
152
152
|
|
153
|
-
僕の環境では存在しないロケールja_JP.UTF-8で試すと同じエラーがおきます。
|
153
|
+
僕の環境では存在しないロケールja_JP.UTF-8で修正前のコードを試すと同じエラーがおきます。
|
154
154
|
|
155
155
|
|
156
156
|
|
@@ -167,3 +167,15 @@
|
|
167
167
|
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)
|
168
168
|
|
169
169
|
```
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
.encode('utf-8')を追加した修正後のコードであれば、存在しないロケールを無理やり指定してもエラーになりません。
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
```bash
|
178
|
+
|
179
|
+
$ LANG=ja_JP.UTF-8 python3 test.py
|
180
|
+
|
181
|
+
```
|
2
書式の改善?
test
CHANGED
@@ -90,7 +90,7 @@
|
|
90
90
|
|
91
91
|
|
92
92
|
|
93
|
-
ちなみに端末の環境は次の通り。
|
93
|
+
ちなみに端末の環境は次の通り。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
|
94
94
|
|
95
95
|
|
96
96
|
|
@@ -132,7 +132,7 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
-
言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。
|
135
|
+
言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。
|
136
136
|
|
137
137
|
|
138
138
|
|
1
正しいコマンドに変更
test
CHANGED
@@ -26,19 +26,65 @@
|
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
僕の最初のコメントの提案がうまく行かなかった理由はおそらくja_JP.UTF-8ロケールが存在しないためです。
|
29
|
+
僕の最初のコメントの提案がうまく行かなかった理由はおそらくja_JP.UTF-8ロケールが存在しないためです。locale -aコマンドを僕の環境で実行するとja_JP.UTF-8はありません。Ubuntuを日本語の設定なしでインストールすると多分同じ結果になると思います。
|
30
30
|
|
31
31
|
|
32
32
|
|
33
33
|
```bash
|
34
34
|
|
35
|
-
|
35
|
+
$ locale -a
|
36
36
|
|
37
|
+
C
|
37
38
|
|
39
|
+
C.UTF-8
|
38
40
|
|
41
|
+
en_AG
|
39
42
|
|
43
|
+
en_AG.utf8
|
40
44
|
|
45
|
+
en_AU.utf8
|
46
|
+
|
47
|
+
en_BW.utf8
|
48
|
+
|
49
|
+
en_CA.utf8
|
50
|
+
|
51
|
+
en_DK.utf8
|
52
|
+
|
53
|
+
en_GB.utf8
|
54
|
+
|
55
|
+
en_HK.utf8
|
56
|
+
|
57
|
+
en_IE.utf8
|
58
|
+
|
59
|
+
en_IL
|
60
|
+
|
61
|
+
en_IL.utf8
|
62
|
+
|
63
|
+
en_IN
|
64
|
+
|
65
|
+
en_IN.utf8
|
66
|
+
|
67
|
+
en_NG
|
68
|
+
|
69
|
+
en_NG.utf8
|
70
|
+
|
71
|
+
en_NZ.utf8
|
72
|
+
|
73
|
+
en_PH.utf8
|
74
|
+
|
75
|
+
en_SG.utf8
|
76
|
+
|
41
|
-
en_US.
|
77
|
+
en_US.utf8
|
78
|
+
|
79
|
+
en_ZA.utf8
|
80
|
+
|
81
|
+
en_ZM
|
82
|
+
|
83
|
+
en_ZM.utf8
|
84
|
+
|
85
|
+
en_ZW.utf8
|
86
|
+
|
87
|
+
POSIX
|
42
88
|
|
43
89
|
```
|
44
90
|
|
@@ -50,21 +96,45 @@
|
|
50
96
|
|
51
97
|
```bash
|
52
98
|
|
53
|
-
$ e
|
99
|
+
$ locale
|
54
100
|
|
55
|
-
en_US.UTF-8
|
101
|
+
LANG=en_US.UTF-8
|
56
102
|
|
57
|
-
|
103
|
+
LANGUAGE=
|
58
104
|
|
59
|
-
LC_TE
|
105
|
+
LC_CTYPE="en_US.UTF-8"
|
60
106
|
|
107
|
+
LC_NUMERIC="en_US.UTF-8"
|
108
|
+
|
61
|
-
LC_TE
|
109
|
+
LC_TIME="en_US.UTF-8"
|
110
|
+
|
111
|
+
LC_COLLATE="en_US.UTF-8"
|
112
|
+
|
113
|
+
LC_MONETARY="en_US.UTF-8"
|
114
|
+
|
115
|
+
LC_MESSAGES="en_US.UTF-8"
|
116
|
+
|
117
|
+
LC_PAPER="en_US.UTF-8"
|
118
|
+
|
119
|
+
LC_NAME="en_US.UTF-8"
|
120
|
+
|
121
|
+
LC_ADDRESS="en_US.UTF-8"
|
122
|
+
|
123
|
+
LC_TELEPHONE="en_US.UTF-8"
|
124
|
+
|
125
|
+
LC_MEASUREMENT="en_US.UTF-8"
|
126
|
+
|
127
|
+
LC_IDENTIFICATION="en_US.UTF-8"
|
128
|
+
|
129
|
+
LC_ALL=
|
62
130
|
|
63
131
|
```
|
64
132
|
|
65
133
|
|
66
134
|
|
67
|
-
言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。
|
135
|
+
言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
|
136
|
+
|
137
|
+
|
68
138
|
|
69
139
|
|
70
140
|
|