总结:如何独立打印unicode系统以生成播放卡符号?
我做错了,我认为自己非常流利的Python,除非我似乎无法正确打印!
# coding: utf-8
from __future__ import print_function
from __future__ import unicode_literals
import sys
symbols = ('♥','♦','♠','♣')
# red suits to sdterr for IDLE
print(' '.join(symbols[:2]), file=sys.stderr)
print(' '.join(symbols[2:]))
sys.stdout.write(symbols) # also correct in IDLE
print(' '.join(symbols))
打印到控制台,这是控制台应用程序的主要控制因素,虽然失败了:
J:\test>chcp
Aktiivinen koodisivu: 850
J:\test>symbol2
Traceback (most recent call last):
File "J:\test\symbol2.py", line 9, in <module>
print(''.join(symbols))
File "J:\Python26\lib\encodings\cp850.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-3: character maps to <unde
fined>
J:\test>chcp 437
Aktiivinen koodisivu: 437
J:\test>d:\Python27\python.exe symbol2.py
Traceback (most recent call last):
File "symbol2.py", line 6, in <module>
print(' '.join(symbols))
File "d:\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2660' in position 0: character maps
o <undefined>
J:\test>
所以总结summarum我有控制台应用程序,只要你不使用控制台,但IDLE。
我当然可以通过chr:
生成符号来自己生成符号# correct symbols for cp850
print(''.join(chr(n) for n in range(3,3+4)))
但这看起来非常愚蠢。我不会让程序只在Windows上运行或有许多特殊情况(如条件编译)。我想要可读的代码。
我不介意输出哪些字母,只要它看起来是正确的,无论是诺基亚手机,Windows还是Linux。 Unicode应该这样做,但它无法正确打印到控制台
答案 0 :(得分:2)
每当我需要输出utf-8字符时,我使用以下方法:
import codecs
out = codecs.getwriter('utf-8')(sys.stdout)
str = u'♠'
out.write("%s\n" % str)
每次需要将某些内容发送到sdtout / stderr时,这会为我节省encode('utf-8')
。
答案 1 :(得分:1)
回应更新后的问题
由于你想要做的就是在CMD上打印出UTF-8字符,你运气不好,CMD不支持UTF-8:
Is there a Windows command shell that will display Unicode characters?
旧答案
你在这里尝试做什么并不完全清楚,我最好的办法是你想把 编码 UTF-8写入文件。
你的问题是:
symbols = ('♠','♥', '♦','♣')
虽然您的文件编码可能是UTF-8,但除非您使用Python 3,否则您的字符串默认情况下不会是UTF-8,您需要在它们前面添加一个小u
:
symbols = (u'♠', u'♥', u'♦', u'♣')
您的str(arg)
将unicode字符串转换回正常字符串,只需将其删除或使用unicode(arg)
转换为unicode字符串
.decode()
的命名可能令人困惑,这会将字节解码为UTF-8,但您需要做的是 编码 UTF -8到字节,所以使用.encode()
您没有以二进制模式写入文件,而不是open('test.txt', 'w')
您需要使用open('test.txt', 'wb')
(注意wb
)这将以二进制文件打开文件模式在Windows上很重要
如果我们把所有这些放在一起,我们得到:
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
symbols = (u'♠',u'♥', u'♦',u'♣')
print(' '.join(symbols))
print('Failure!')
def print(*args,**kwargs):
end = kwargs[end] if 'end' in kwargs else '\n'
sep = kwargs[sep] if 'sep' in kwargs else ' '
stdout = sys.stdout if 'file' not in kwargs else kwargs['file']
stdout.write(sep.join(unicode(arg).encode('utf-8') for arg in args))
stdout.write(end)
print(*symbols)
print('Success!')
with open('test.txt', 'wb') as testfile:
print(*symbols, file=testfile)
很高兴将字节 编码 UTF-8写入文件(至少在我的Ubuntu框中)。
答案 2 :(得分:1)
使用Unicode字符串和codecs
模块:
或者:
# coding: utf-8
from __future__ import print_function
import sys
import codecs
symbols = (u'♠',u'♥',u'♦',u'♣')
print(u' '.join(symbols))
print(*symbols)
with codecs.open('test.txt','w','utf-8') as testfile:
print(*symbols, file=testfile)
或:
# coding: utf-8
from __future__ import print_function
from __future__ import unicode_literals
import sys
import codecs
symbols = ('♠','♥','♦','♣')
print(' '.join(symbols))
print(*symbols)
with codecs.open('test.txt','w','utf-8') as testfile:
print(*symbols, file=testfile)
无需重新实施print
。
答案 3 :(得分:0)
Windows控制台中的UTF-8是一个漫长而痛苦的故事。
您可以阅读issue 1602和issue 6058,并且可以使用或多或少的功能,但它很脆弱。
让我总结一下:
Lib/encodings/aliases.py
Lucida Console
或Consolas
作为您的控制台字体chcp 65001