Python,如何打印中文、韩文、日文字符串

5
在Python中,对于日语、中文和韩语,Python无法正确输出字符串,例如日语、韩语和中文的“hello”的表示:
こんにちは
안녕하세요
你好

并打印出这些字符串:

In [1]: f = open('test.txt')

In [2]: for _line in f.readlines():
   ...:     print(_line)
   ...:     
こんにちは

안녕하세요

你好


In [3]: f = open('test.txt')

In [4]: print(f.readlines())
[ '\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\n', '\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94\n', '\xe4\xbd\xa0\xe5\xa5\xbd\n']

In [5]: a = '你好'

In [6]: a
Out[6]: '\xe4\xbd\xa0\xe5\xa5\xbd'

我的Python版本是2.7.11,操作系统是Ubuntu 14.04。

如何处理这些字符串'\xe4\xbd\xa0\xe5\xa5\xbd\n'

谢谢!


迭代文件并打印各个元素。for line in f.readlines(): print line - letmutx
处理这些字符串是什么意思? - letmutx
@user161151,你不能保证每次都能正确打印这些字符串,如果它打印出'\xe4\xbd\xa0\xe5\xa5\xbd\n'这样的字符串,那么很难理解这些输出。那么如何确保它总是打印正确的字符串呢? - GoingMyWay
正确的字符串是什么意思?这些 {[u'\u3053\u3093\u306b\u3061\u306f\n', u'\uc548\ub155\ud558\uc138\uc694\n', u'\u4f60\u597d']} 是什么? - Karl Doenitz
1
@HannesOvrén,我的Python版本是2.7.11。操作系统是Ubuntu 14.04。系统语言是英语。 - GoingMyWay
显示剩余4条评论
5个回答

3
首先,您需要将文本作为Unicode读取。
import codecs
f = codecs.open('test.txt','r','utf-8')

第二步

在打印时,您应该像这样进行编码

unicodeText.encode('utf-8')

第三步

您应该确保控制台支持Unicode显示

用法

print sys.getdefaultencoding()

如果不尝试

reload(sys)
sys.setdefaultencoding('utf-8')

当我尝试使用 sys.setdefaultencoding('utf-8') 时,我收到了一个错误消息:AttributeError: module 'sys' has no attribute 'setdefaultencoding' - Samuel Muldoon

2

我的Python版本是2.7.11,操作系统是Mac OSX,我写的代码如下:

こんにちは
안녕하세요
你好

将文件保存为test.txt。我的程序是:

# -*-coding:utf-8-*-

import json


if __name__ == '__main__':
    f = open("./test.txt", "r")
    a = f.readlines()
    print json.dumps(a, ensure_ascii=False)
    f.close()

运行程序,结果:

["こんにちは\n", "안녕하세요\n", "你好"]

这完全不同。你正在编写Python列表的JSON字符串表示形式,而不是列表本身。 - Hannes Ovrén
1
我尝试了一些方法,如果你想要获取一个列表类型的数据,那么在打印列表中的数据时必须进行转义。你知道如何在不转义的情况下打印列表数据吗? - Karl Doenitz

2
你所看到的是以下两者之间的区别:
1. 打印一个字符串 2. 打印一个列表
或更一般地说,这是对象的“非正式”和“正式”字符串表示之间的区别(请参见文档)。
在第一种情况下,Unicode字符串将被正确打印,就像你期望的那样,包括Unicode字符。
在第二种情况下,列表项将使用它们的表示而不是它们的字符串值进行打印。
for line in f.readlines():
    print line

这是第一个(好的)情况。
print f.readlines()

这是第二种情况。
您可以通过这个例子来检查差异:
 a = u'ð€œłĸªßð'
 print a
 print a.__repr__()
 l = [a, a]
 print l

这说明了特殊方法__str__()__repr__()之间的区别,你可以自己尝试一下。
class Person(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name
    def __repr__(self):
        return '<Person name={}>'.format(self.name)

p = Person('Donald')
print p  #  Prints 'Donald' using __str__
p # On the command line, prints '<Person name=Donald>' using __repr__

即,当您在控制台上仅键入对象名称时看到的值由__repr__定义,而使用print时看到的值由__str__定义。

OP使用Python3,而你们的讨论是关于Python2的行为。 - gboffi
@gboffi:我们确定吗?是你添加了Python-3标签,而不是OP。print-as-a-function表示Python 3,但由于他可能使用了from __future__ ...,我们不能百分之百确定。除非使用Python 2,否则我无法重现OP的问题。 - Hannes Ovrén
@AlexanderYau 请在你的问题中添加 from __future__ import,或者添加相关的 Python2.x 标签。 - gboffi
@gboffi,对不起。 - GoingMyWay
1
抱歉,我在问题中误用了print作为函数,对于造成的干扰感到抱歉... - gboffi

0

我也曾被同样的问题困扰。
这肯定是你正在使用的字体的限制。
默认情况下,它设置为 "Consolas"。

你可以将其更改为 "MS Gothic" 或 "NSimSun"。 我个人更喜欢后者。 它们都能够显示日文/中文字符,但请确保您的系统编码设置为 utf-8,如上面回答中所提到的。

要在 cmd 中更改字体,请执行以下操作:

  1. 单击 cmd 窗口左上角的 cmd 图标。
  2. 出现一个下拉菜单。选择“属性”。
  3. 从第二部分显示的列表中选择你喜欢的字体。
  4. 点击确定。

0

试试这个:

import codecs

fp = codecs.open('test.txt', encoding='utf-8')

for line in fp:
    print line

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接