8

如何正确阅读日文和中文字符。我正在使用python 2.5。输出显示为"E:\Test\?????????"

path = r"E:\Test\は最高のプログラマ"
t = path.encode()
print t
u = path.decode()
print u
t = path.encode("utf-8")
print t
t = path.decode("utf-8")
print t
4

3 回答 3

14

请务必阅读Python Unicode HOWTO;它解释了如何在 Python 代码中处理和包含非 ASCII 文本。

如果您想在代码中包含日语文本文字,您有几种选择:

  • 使用 unicode 文字(创建unicode对象而不是字节字符串),但任何非 ascii 代码点都由 unicode 转义字符表示。它们采用 的形式\uabcd,因此是反斜杠、au和 4 个十六进制数字:

    ru = u'\u30EB'
    

    将是一个字符,片假名“ru”代码点(“ル”)。

  • 使用 unicode 文字,但以某种编码形式包含字符。您的文本编辑器将以给定的编码(例如 UTF-16)保存文件;您需要在源文件的顶部声明该编码:

    # encoding: utf-16
    
    ru = u'ル'
    

    其中包含“ル”而不使用转义符。Python 2 文件的默认编码是 ASCII,因此通过声明编码,您可以直接使用日语。

  • 使用字节字符串文字,准备好编码。通过其他方式对代码点进行编码,并将它们包含在您的字节字符串文字中。如果你要做的只是以编码形式使用它们,这应该没问题:

    ru = '\xeb\x30'  # ru encoded to UTF16 little-endian
    

    我将“ル”编码为 UTF-16 little-endian,因为这是默认的 Windows NTFS 文件名编码。

下一个问题将是您的终端,Windows 控制台因不支持许多开箱即用的字符集而臭名昭著。您可能希望将其配置为处理 UTF-8。有关详细信息,请参阅此问题,但您需要在控制台中运行以下命令:

chcp 65001

切换到 UTF-8,您可能需要切换到可以处理您的代码点的控制台字体(也许是 Lucida?)。

于 2013-02-04T08:55:08.263 回答
5

有两个独立的问题:

  1. 如果您使用非 ascii 字符并为表示文本的数据使用 Unicode 文字,则应指定 Python 源编码,例如:

    # -*- coding: utf-8 -*-
    path = ur"E:\Test\は最高のプログラマ"
    
  2. 将 Unicode 打印到 Windows 控制台很复杂,但如果您设置了正确的字体,那么只需:

    print path
    

    可能会奏效。

不管你的控制台能否显示路径;将 Unicode 路径传递给文件系统函数应该没问题,例如:

entries = os.listdir(path)

不要调用.encode(char_enc)字节字符串,而是调用 Unicode 字符串。
不要调用.decode(char_enc)Unicode 字符串,而是调用字节字符串。

于 2013-02-04T09:40:06.713 回答
3

您应该强制字符串成为unicode

path = ur"E:\Test\は最高のプログラマ"

与 2.5 相关的字符串文字的文档位于此处

编辑:如果对象在 2.5 中,我不肯定,unicode但文档确实说明\uXXXX[XXXX]将被处理并且字符串将是“Unicode 字符串”。

于 2013-02-04T08:37:31.093 回答