回答編集履歴

6

誤字修正

2020/04/26 23:36

投稿

Kenji.Noguchi
Kenji.Noguchi

スコア358

test CHANGED
@@ -182,4 +182,4 @@
182
182
 
183
183
 
184
184
 
185
- 大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたりディスクの読み書きやネットワーク、popen(),system()などで外部コマンドを呼び出す時が外の世界になります。その時だけエンコードに注意しましょう。Pythonの内側では、出来る限り文字列はUnicodeオブジェクトのまま、バイト列はbytesのままにすれば、うまく行くようにPythonのライブラリが設計されているからです。今回のファイル名も外界になることは盲点で、僕も勉強になりました。
185
+ 大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたりディスクの読み書きやネットワーク、popen(),system()などで外部コマンドを呼び出す時が外の世界になります。その時だけエンコードに注意しましょう。Pythonの内側では、出来る限り文字列はUnicodeオブジェクトのまま、バイト列はbytesのままにすれば、うまく行くようにPythonのライブラリが設計されているからです。今回のファイル名も外界になることは盲点で、僕も勉強になりました。

5

コメント追加

2020/04/26 23:35

投稿

Kenji.Noguchi
Kenji.Noguchi

スコア358

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

誤字

2020/04/26 20:06

投稿

Kenji.Noguchi
Kenji.Noguchi

スコア358

test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
 
92
92
 
93
- ちなみに端末の環境は次の通り。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
93
+ ちなみに端末の環境は次の通り。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
94
94
 
95
95
 
96
96
 

3

説明を追加。くどいかも。

2020/04/26 19:46

投稿

Kenji.Noguchi
Kenji.Noguchi

スコア358

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

書式の改善?

2020/04/26 19:45

投稿

Kenji.Noguchi
Kenji.Noguchi

スコア358

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

正しいコマンドに変更

2020/04/26 19:39

投稿

Kenji.Noguchi
Kenji.Noguchi

スコア358

test CHANGED
@@ -26,19 +26,65 @@
26
26
 
27
27
 
28
28
 
29
- 僕の最初のコメントの提案がうまく行かなかった理由はおそらくja_JP.UTF-8ロケールが存在しないためです。次のコマンドを僕の環境で実行するとen_US.UTF-8しかありません。Ubuntuを日本語の設定なしでインストールすると多分同じ結果になると思います。
29
+ 僕の最初のコメントの提案がうまく行かなかった理由はおそらくja_JP.UTF-8ロケールが存在しないためです。locale -aコマンドを僕の環境で実行するとja_JP.UTF-8ありません。Ubuntuを日本語の設定なしでインストールすると多分同じ結果になると思います。
30
30
 
31
31
 
32
32
 
33
33
  ```bash
34
34
 
35
- grep -v ^# /etc/locale.gen
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.UTF-8 UTF-8
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
- $ echo $LANG
99
+ $ locale
54
100
 
55
- en_US.UTF-8
101
+ LANG=en_US.UTF-8
56
102
 
57
- $ env | grep LC_
103
+ LANGUAGE=
58
104
 
59
- LC_TERMINAL=iTerm2
105
+ LC_CTYPE="en_US.UTF-8"
60
106
 
107
+ LC_NUMERIC="en_US.UTF-8"
108
+
61
- LC_TERMINAL_VERSION=3.3.9
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