2015-08-20 2 views
5

Im пытается напечатать смайлик в Python: ☺Как правильно настроить кодировку Python 3 (и cmd.exe)?

Он работает без каких-либо проблем в интерактивной оболочке (внутри cmd.exe)

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AM 
D64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print("☺") 
☺ 

Но если я попробовать то же самое из файловой I получите эту ошибку:

Traceback (most recent call last): 
    File "main.py", line 8, in <module> 
    print("\u263a") 
    File "C:\dev\lang\Python34\lib\encodings\cp850.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u263a' in position 
0: character maps to <undefined> 

Файл Python кодируется в кодировке UTF-8.


Update:

Даже если это не настоящая Anwer моей проблемы все же, это стоит прочитать комментарии по этому вопросу. Я также создал список всех печатных символов со стандартным растровым шрифтом cmd.exe (проверен на Windows 10). Чтобы напечатать символ, просто используйте функцию chr(). Например chr(14) дает

0  [space] 
1  ☺ 
2  ☻ 
3  ♥ 
4  ♦ 
5  ♣ 
6  ♠ 
7  [nothing] 
8  [backspace, removes char before] 
9  [tabulator] 
10  [newline] 
11  ♂ 
12  ♀ 
13  [takes part after chr(13) and replaces begin of string with it] 
14  ♫ 
15  ☼ 
16  ► 
17  ◄ 
18  ↕ 
19  ‼ 
20  ¶ 
21  § 
22  ▬ 
23  ↨ 
24  ↑ 
25  ↓ 
26  → 
27  ← 
28  ∟ 
29  ↔ 
30  ▲ 
31  ▼ 
32  [space] 
33  ! 
34  " 
35  # 
36  $ 
37  % 
38  & 
39  ' 
40  (
41  ) 
42  * 
43  + 
44  , 
45  - 
46  . 
47 /
48  0 
49  1 
50  2 
51  3 
52  4 
53  5 
54  6 
55  7 
56  8 
57  9 
58  : 
59  ; 
60  < 
61  = 
62  > 
63  ? 
64  @ 
65  A 
66  B 
67  C 
68  D 
69  E 
70  F 
71  G 
72  H 
73  I 
74  J 
75  K 
76  L 
77  M 
78  N 
79  O 
80  P 
81  Q 
82  R 
83  S 
84  T 
85  U 
86  V 
87  W 
88  X 
89  Y 
90  Z 
91  [ 
92  \ 
93  ] 
94 ^
95  _ 
96  ` 
97  a 
98  b 
99  c 
100  d 
101  e 
102  f 
103  g 
104  h 
105  i 
106  j 
107  k 
108  l 
109  m 
110  n 
111  o 
112  p 
113  q 
114  r 
115  s 
116  t 
117  u 
118  v 
119  w 
120  x 
121  y 
122  z 
123  { 
124  | 
125  } 
126  ~ 
127  ⌂ 
160  [space] 
161  ¡ 
162  ¢ 
163  £ 
164  ¤ 
165  ¥ 
166  ¦ 
167  § 
168  ¨ 
169  © 
170  ª 
171  « 
172  ¬ 
173  ­[shorter -, can't be displayed outside of console] 
174  ® 
175  ¯ 
176  ° 
177  ± 
178  ² 
179  ³ 
180  ´ 
181  µ 
182  ¶ 
183  · 
184  ¸ 
185  ¹ 
186  º 
187  » 
188  ¼ 
189  ½ 
190  ¾ 
191  ¿ 
192  À 
193  Á 
194  Â 
195  Ã 
196  Ä 
197  Å 
198  Æ 
199  Ç 
200  È 
201  É 
202  Ê 
203  Ë 
204  Ì 
205  Í 
206  Î 
207  Ï 
208  Ð 
209  Ñ 
210  Ò 
211  Ó 
212  Ô 
213  Õ 
214  Ö 
215  × 
216  Ø 
217  Ù 
218  Ú 
219  Û 
220  Ü 
221  Ý 
222  Þ 
223  ß 
224  à 
225  á 
226  â 
227  ã 
228  ä 
229  å 
230  æ 
231  ç 
232  è 
233  é 
234  ê 
235  ë 
236  ì 
237  í 
238  î 
239  ï 
240  ð 
241  ñ 
242  ò 
243  ó 
244  ô 
245  õ 
246  ö 
247  ÷ 
248  ø 
249  ù 
250  ú 
251  û 
252  ü 
253  ý 
254  þ 
255  ÿ 
305  ı 
402  ƒ 
8215 ‗ 
9472 ─ 
9474 │ 
9484 ┌ 
9488 ┐ 
9492 └ 
9496 ┘ 
9500 ├ 
9508 ┤ 
9516 ┬ 
9524 ┴ 
9532 ┼ 
9552 ═ 
9553 ║ 
9556 ╔ 
9559 ╗ 
9562 ╚ 
9565 ╝ 
9568 ╠ 
9571 ╣ 
9574 ╦ 
9577 ╩ 
9580 ╬ 
9600 ▀ 
9604 ▄ 
9608 █ 
9617 ░ 
9618 ▒ 
9619 ▓ 
9632 ■ 
+0

За последнюю пару недель я тоже боролся с 'UnicodeEncodeError', пытаясь напечатать символы Unicode, символы Unicode, доступные на Windows, с помощью простого альта -код и нормальные символы на консоли cmd при перенаправлении с cmd, на консоль Powershell и при перенаправлении с Powershell. В двух словах, каждая программа, метод ввода и метод вывода используют другую кодировку и другую кодовую страницу и разные строки. Это беспорядок. Я закончил с кучей 'try..except' и docstring с обходным решением. – TigerhawkT3

+0

Однако я могу проверить, что родной Unicode (UTF-8) терминал или эмулятор терминала, как Linux KDE Konsole, обрабатывает символы Unicode без проблем. – TigerhawkT3

+0

Я получил ваш пример для работы, используя этот [ответ] (http://stackoverflow.com/a/17177904/3900879). Я изменил шрифт 'cmd' на' Lucida Console' и использовал 'chcp 65001' (кодовая страница [65001] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs .85% 29.aspx) - UTF-8). –

ответ

0

При перенаправлении в файл Python не знает, какую кодировку использовать. Перенаправление в файл - это операция оболочки, и Python понимает переменную оболочки, которая указывает кодировку. Установите следующие переменные окружения перед перенаправлением в файл:

PYTHONIOENCODING=utf8 
+0

Итак, я ввел 'SET PYTHONIOENCODING = utf8' в командную строку. (Правда?) К сожалению, ничего не изменилось ... Не кодировка UTF-8 по умолчанию? – Daveman

+0

Вы перенаправили вывод своего скрипта в файл? По умолчанию консольная кодировка не UTF-8. Как вы можете видеть из собственного сообщения об ошибке, Python использует текущую кодовую страницу консоли, которая в вашей системе была 'cp850'. –

Смежные вопросы