Python 打印日文(中文)字符

Python 打印日文(中文)字符,python,unicode,Python,Unicode,我读日语,想试着处理一些日语文本。我使用Python 3尝试了这一点: for i in range(1,65535): print(chr(i), end='') Python然后给了我大量的错误。出了什么问题 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Traceback (most recent call last)

我读日语,想试着处理一些日语文本。我使用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>
!“#$%&'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~回溯(最后一次最近调用):
文件“C:\test\char.py”,第11行,在
打印(chr(i),结束=“”)
文件“C:\Python31\lib\encodings\cp1252.py”,第19行,编码
返回codecs.charmap\u encode(输入、自身错误、编码表)[0]
UnicodeEncodeError:“charmap”编解码器无法对位置0中的字符“\x80”进行编码:字符映射到
我的理解是,chr函数继续将Unicode数字转换为相应的日文字符。如果是,为什么日文字符没有输出?为什么它会在罗马字符列表的末尾崩溃

如果我错误地认为Unicode集合是专门为非西方语言设计的,请也纠正我


编辑

我在空闲状态下尝试了John Machin建议的3条线路,输出正常

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


然而,对于大多数其他事情来说,输出是正确捕获的;那么为什么在这个过程中它会失败呢?也就是说,为什么代码在空闲的Python Shell中工作,而不是通过程序员的记事本输出捕获?不管接口如何,输出不应该是相同的吗?

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

您的问题是您的默认终端(输出)编码。可能是拉丁语-1,甚至是Python的默认值ASCII。这些字符不能编码日语字符(因为假设终端不能显示它们)

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

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

至于“单独”,我认为这是错误的。它被创建为绑定它们的唯一编码…嗯,对不起,这是我们永远需要的唯一编码。编码(好的,这使用的是“编码”,而不是Unicode定义中使用的编码)这可以用来对所有文本文档进行编码。

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

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

如果你的代码按你想象的那样工作,它不仅可以打印“罗马”字符,还可以打印希腊语、阿拉伯语、希伯来语、西里尔语(用于俄语等)、亚美尼亚语、印度使用的六个左右不同但相关的字符集,我遗漏了很多,大约11000个韩语音节(用于韩语)还有一大堆没有使用的代码点的胡言乱语,并且(取决于您在哪个shell中运行它)在到达0xD800(第一个代理)时可能已经崩溃

少一点雄心壮志会给你平假名、片假名和一些“中日韩统一表意文字”

>>> 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吗?)这对于你的Romaji来说是足够的,但其他的就不多了。在任何地方都可以下载,没有其他选择:(1)空闲(2)写UTF-8编码的文件,然后在记事本中读取。我相信其他人可能会建议使用其他IDE

for i in range(0x3040, 0x30a0): print unichr(i),
以上是平假名字符集。您可以对片假名和汉字使用相同的utf-8编码


请记住,日本人平均使用大约2000-2500个汉字。然而,中文大概在5000-6000左右。

一点警告:不要在家里尝试此代码;)几乎挂起了我的终端。app.BTW,在Mac OS X上对我有效。相关:相关:@kennytm:在我的Ubuntu机器上,Gnome内部的tmux会话需要0.2秒终端。很抱歉,但我还有3个问题:1.Python中的“编解码器”是什么?它是一个模块吗?2.什么是“正确映射”?3.如何使用for循环生成日语字符列表?编解码器是一个“编码器/解码器”(查找“调制解调器”,类似)。实际上,它应该是“编码器/解码器”,但我猜是“调制解调器”模拟听上去更好(会变成“encdec”…这肯定很难看)。它是一个“东西”(不确定它是一个模块还是一个类,我认为是后者),既可以编码为特定的编码(来自Unicode,它不是编码),也可以解码为Unicode。将其视为“翻译人员”。“正确的映射”。。。只是Python使用的编解码器不知道如何对\x80进行编码。正如伍布尔所说,“没有定义”。现在我已经没有汉字了(哈哈)是的,我知道日语的音节,汉字在日语中的使用程度,我的代码会打印出与前两者无关的其他字符。我尝试了所有3个代码,但一直出现以下错误:返回codecs.charmap_encode(输入,self.errors,encoding_table)[0]UnicodeEncodeError:“charmap”codec无法对位置0:字符映射到@user283169:的字符“\u3040”进行编码:不要在注释中添加该细节;编辑您的问题以显示完整的回溯和错误