2015-08-20 1 views
5

Im Versuch, ein Smiley in Python zu drucken: ☺Wie richtet man Python 3 (und cmd.exe) korrekt ein?

es ohne Probleme in der interaktiven Shell (innen 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("☺") 
☺ 

Aber wenn ich versuche, die gleiche Sache aus einer Datei-I arbeitet Erhalten Sie diesen Fehler:

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> 

Die Python-Datei ist UTF-8 codiert.


Update:

Selbst wenn es zu meinem Problem noch kein wirkliches anwer ist, dann ist es lohnt sich, die Kommentare unter der Frage zu lesen. Ich habe auch eine Liste aller druckbaren Zeichen mit der Standard-Raster-Schriftart der cmd.exe erstellt (getestet unter Windows 10). Um ein Zeichen zu drucken, benutzen Sie einfach die chr() Funktion. Zum Beispiel chr(14) gibt Ihnen

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

In den letzten paar Wochen, auch ich habe zu kämpfen mit 'UnicodeEncodeError' und versuchte, Unicode-Zeichen zu drucken, Unicode-Zeichen zugänglich unter Windows mit einem einfachen alt -code und normale Zeichen ordnungsgemäß auf der cmd-Konsole, beim Weiterleiten von cmd, auf der Powershell-Konsole und beim Weiterleiten von Powershell. Kurz gesagt, jedes Programm, jede Eingabemethode und jede Ausgabemethode verwendet eine andere Codierung und eine andere Codepage und verschiedene Zeilenenden. Es ist ein Chaos. Ich landete mit einer Reihe von "Versuch" -Ausnahmen und einem Docstring mit einem Workaround. – TigerhawkT3

+0

Ich kann jedoch überprüfen, ob ein natives Unicode (UTF-8) -Terminal oder Terminal-Emulator, wie die Linux-KDE-Konsole, Unicode-Zeichen ohne Probleme verarbeitet. – TigerhawkT3

+0

Ich habe Ihr Beispiel zur Arbeit mit dieser [Antwort] (http://stackoverflow.com/a/17177904/3900879). Ich habe meine 'cmd' Schriftart in' Lucida Konsole' geändert und 'chcp 65001' (Codepage [65001] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs) verwendet .85% 29.aspx) ist UTF-8). –

Antwort

0

Wenn Sie in eine Datei umleiten Python nicht weiß, welche Codierung zu verwenden. Die Umleitung zu einer Datei ist eine Shell-Operation, und Python versteht eine Shell-Variable, die die zu verwendende Codierung angibt. Legen Sie die folgende Umgebungsvariable, bevor in eine Datei umleiten:

PYTHONIOENCODING=utf8 
+0

Also habe ich 'SET PYTHONIOENCODING = utf8' in die Kommandozeile eingegeben. (Richtig?) Leider hat sich nichts geändert ... Ist UTF-8 nicht die Standard-Kodierung? – Daveman

+0

Haben Sie dann die Ausgabe Ihres Skripts in eine Datei umgeleitet? Die Standardkonsolenkodierung ist nicht UTF-8. Wie Sie anhand Ihrer eigenen Fehlermeldung sehen können, verwendet Python die aktuelle Konsolen-Codepage, die auf Ihrem System 'cp850' war. –