Unicode无法正确打印到cp850(cp437),打卡适合

时间:2010-11-20 14:38:03

标签: python windows-xp cmd

总结:如何独立打印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应该这样做,但它无法正确打印到控制台

4 个答案:

答案 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写入文件。

你的问题是:

  1. symbols = ('♠','♥', '♦','♣')虽然您的文件编码可能是UTF-8,但除非您使用Python 3,否则您的字符串默认情况下不会是UTF-8,您需要在它们前面添加一个小u
    symbols = (u'♠', u'♥', u'♦', u'♣')

  2. 您的str(arg)将unicode字符串转换回正常字符串,只需将其删除或使用unicode(arg)转换为unicode字符串

  3. .decode()的命名可能令人困惑,这会将字节解码为UTF-8,但您需要做的是 编码 UTF -8到字节,所以使用.encode()

  4. 您没有以二进制模式写入文件,而不是open('test.txt', 'w')您需要使用open('test.txt', 'wb')(注意wb)这将以二进制文件打开文件模式在Windows上很重要

  5. 如果我们把所有这些放在一起,我们得到:

    # -*- 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 1602issue 6058,并且可以使用或多或少的功能,但它很脆弱。

让我总结一下:

  • Lib/encodings/aliases.py
  • 中添加'cp65001'作为'utf8'的别名
  • 选择Lucida ConsoleConsolas作为您的控制台字体
  • 运行chcp 65001
  • run python