打印出日文(中文)字符

时间:2010-02-28 19:05:15

标签: python unicode

我读日语,想尝试处理一些日文文本。我尝试使用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套装是为了迎合非西方语言而设计的,那么请纠正我。


修改

我尝试了John Machin在IDLE中提出的3行,输出工作正常!

在此之前,我一直在使用程序员的记事本,工具设置为捕获python.exe编译器的输出。也许这就是错误发生的原因。

然而,对于大多数其他事情,输出被正确捕获;那么为什么它在这个过程中特别失败? ie为什么代码在IDLE Python Shell中工作,而不是通过Programmer的Notepad输出捕获?无论接口如何,输出都不应该相同吗?

5 个答案:

答案 0 :(得分:9)

如果你说你读日语,你必须知道日语是用四种不同类型的字符写的:(1)汉字(汉字)(2)片假名(3)平假名(4)罗马字(“罗马字母”)字母)。有成千上万的汉字,其中只有几千个是常用的。

你的代码,如果它按照你想象的那样工作,不仅会打印出“罗马”字符,还会打印希腊语,阿拉伯语,希伯来语,西里尔语(俄语等),亚美尼亚语,半打左右在印度使用的不同但相关的字符集,很多我遗漏了,大约11千个韩文音节(用韩语)和一堆乱码代码点未使用,(取决于你运行它的是哪个shell)当它到达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='')

一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟丠両丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕乖乗乘乙乚乛乜九乞也习乡乢乣乤乥书乧乨乩乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿什仁仂仃仄仅仆仇仈仉今介仌仍从仏仐仑仒仓仔仕他仗付仙仚仛仜仝仞仟仠仡仢代令以仦仧仨仩仪仫们仭仮仯仰仱仲仳仴仵件价仸仹仺任仼份仾仿

更新您遇到问题的原因是您使用的shell / IDE仅提供Windows GUI bog标准标准输出,默认编码(在您的树林中)是cp1252(还记得在你的追溯中提到cp1252吗?)这对你的罗马字母而言是足够的,但不是很多。可随意使用 - 无需下载的替代方案:(1)IDLE(2)以UTF-8编码的文件,并在记事本中读取。我相信其他人可以推荐其他IDE。

答案 1 :(得分:2)

您的问题是您的默认终端(输出)编码。可能是latin-1甚至是常年Python默认的ASCII。那些不能编码日文字符(因为它假设终端不能显示它们)。

如果您的终端使用UTF-8(西方世界中最常用的Unicode编码),您可以“欺骗”Python将其作为默认输出编码,或者您可以明确地将unicode编码为UTF-8与

>>>> print (chr(i).encode("UTF-8"), end='')

至于“单独”,我认为这是错误的。它被创建为 one 编码来绑定它们......嗯,对不起,我们将需要的唯一编码。编码(好吧,那是使用“编码”,而不是在Unicode定义中使用的意义),可用于编码所有文本文档。

答案 2 :(得分:0)

您正在尝试编码未由您的编解码器定义的字符(\ x80);没有正确的映射,因此charmap_encode会引发异常。您可以将print语句包装在try:块中,然后捕获并忽略该异常以仅打印您可以编码的字符。

答案 3 :(得分:0)

无需尝试BMP的所有65536代码。只需使用用于日文文本的code blocks

答案 4 :(得分:-1)

for i in range(0x3040, 0x30a0): print unichr(i),

以上是平假名字符集。您可以对Katakana和Kanji使用相同的utf-8编码。

请记住,日本人平均使用2000-2500左右的汉字字符。但是,中文可能在5000-6000左右。