打印日文(中文)字符
我会日语,想试着处理一些日文文本。我用Python 3尝试了一下:
for i in range(1,65535):
print(chr(i), end='')
结果Python给了我一堆错误。这是怎么回事呢?
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Traceback (most recent call last):
File "C:\test\char.py", line 11, in <module>
print(chr(i), end='')
File "C:\Python31\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x80' in position 0: character maps to <undefined>
我理解的是,chr这个函数是用来把Unicode数字转换成对应的日文字符的。如果是这样,为什么没有输出日文字符呢?为什么在罗马字符列表的最后会崩溃?
如果我理解错了,请纠正我,我以为Unicode这个字符集是专门为了支持非西方语言而设计的。
编辑:
我在IDLE中尝试了John Machin建议的三行代码,结果输出正常!
在这之前,我一直在用程序员记事本,并设置工具来捕捉python.exe编译器的输出。也许这就是错误产生的原因。
不过,对于其他大多数事情,输出都能正常捕捉;那为什么在这个过程中会失败呢?也就是说,为什么代码在IDLE Python Shell中能正常工作,但在程序员记事本的输出捕捉中却不行?难道不应该无论使用哪个界面,输出都是一样的吗?
5 个回答
你正在尝试编码一个字符(\x80),但是你的编码方式里并没有这个字符的定义,所以没有合适的对应关系,这就导致了一个错误。你可以把打印的语句放在一个尝试(try)块里,然后捕捉这个错误并忽略它,这样就只会打印出那些你能编码的字符。
你的问题出在默认的终端(输出)编码上。可能是latin-1,甚至是Python常用的ASCII编码。这些编码无法表示日文字符,因为它们假设终端无法显示这些字符。
如果你的终端支持UTF-8(在西方世界中最常用的Unicode编码),你可以通过一些方法让Python把它当作默认输出编码,或者你可以明确地将unicode编码为UTF-8,使用以下代码:
>>>> print (chr(i).encode("UTF-8"), end='')
至于“唯一性”,我觉得这个说法不太对。它是为了成为绑定所有编码的一种编码而创建的……呃,抱歉,应该说是我们永远需要的唯一编码。这种编码(好吧,这里的“编码”不是指Unicode定义中的意思)可以用来编码所有文本文件。
如果你说你会读日语,那你应该知道日语是用四种不同的字符来写的:(1) 汉字 (也就是中文字符) (2) 片假名 (Katakana) (3) 平假名 (Hiragana) (4) 罗马字 (Romaji,类似于英文的字母)。汉字有很多成千上万种,但常用的只有几千种。
如果你的代码按照你想的那样运行,它不仅会打印出罗马字母,还会打印出希腊字母、阿拉伯字母、希伯来字母、斯拉夫字母(用在俄语等语言中)、亚美尼亚字母,以及印度使用的几种不同但相关的字符集,还有大约一万种韩文音节(用在韩语中),以及一些无意义的字符(这些字符是没有被使用的)。而且,具体情况还得看你用的是什么命令行工具,可能在遇到0xD800(第一个代理字符)时会崩溃。
如果你降低一点目标,你可以得到平假名、片假名和一些“CJK统一汉字”。下面的例子是在IDLE中运行的。
>>> for i in range(0x3040, 0x30a0): print(chr(i), end='')
ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゙゚゛゜ゝゞゟ
>>> for i in range(0x30a0, 0x3100): print(chr(i), end='')
゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ
>>> for i in range(0x4e00, 0x4f00): print(chr(i), end='')
一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟丠両丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕乖乗乘乙乚乛乜九乞也习乡乢乣乤乥书乧乨乩乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿什仁仂仃仄仅仆仇仈仉今介仌仍从仏仐仑仒仓仔仕他仗付仙仚仛仜仝仞仟仠仡仢代令以仦仧仨仩仪仫们仭仮仯仰仱仲仳仴仵件价仸仹仺任仼份仾仿
更新 你遇到问题的原因是你使用的命令行工具/集成开发环境(IDE)只提供了Windows的标准输出,而默认的编码(在你所在的地区)是cp1252(你在错误追踪中提到的cp1252),这对于罗马字母来说还可以,但其他的就不太行了。你可以使用一些不需要下载的替代方案:(1) IDLE (2) 写一个UTF-8编码的文件,然后在记事本中打开。我相信还有其他人可以推荐其他的IDE。