【问题标题】:Python: working with unicode charactersPython:使用 unicode 字符
【发布时间】:2018-07-11 21:53:18
【问题描述】:

我正在尝试学习如何在 python 中使用 Unicode。

假设我有一个包含 Unicode 字符的文件 testáéíóúabcdefgçë 我想制作一个打印出文件中所有唯一字符的python脚本。这就是我所拥有的:

#!/usr/bin/python

import sys

def main():
    if len(sys.argv) < 2:
        print("Argument required.")
        exit()
    else:
        filename = sys.argv[1]
        with open(filename, "r") as fp:
            string = fp.read().replace('\n', '')
        chars = set()
        for char in string:
            chars.add(char)
        for char in chars:
            sys.stdout.write(char)
        print("")

if __name__ == "__main__":
    main()

这不能正确打印 Unicode 字符:

$ ./unicode.py test
▒a▒bedgf▒▒▒▒c▒▒

这样做的正确方法是什么,以便正确打印字符?

【问题讨论】:

  • 你使用的是什么版本的 Python,你在什么平台上?那个文件test存储在什么编码中?
  • 如果您不知道如何回答最后一部分,如果您使用的是 Python 3,请尝试以下操作:with open(filename,'rb') as f: print(f.read()),然后向我们展示打印出来的 b'…whatever…'。跨度>
  • 一旦你有了编码,如果它是非标准的,你应该以二进制文件(open(filename, 'rb'))打开文件,然后在读取字符串上使用.decode([encoding name])
  • Python 2.7.5,运行 Scientific Linux 7(类似于 red hat 和 centos)。编码为:text/plain; charset=utf-8.
  • @csunday95 你提出的方法比open(filename, encoding=[encoding_name])有什么优势?

标签: python unicode python-2.x


【解决方案1】:

您的数据已编码,很可能是 utf-8。 utf-8 使用多于一个字节来编码非 ascii 字符,例如áéíóú。遍历编码为 utf-8 的字符串会产生构成字符串的单个 bytes,而不是您期望的 characters

>>> s = 'áéíóúabcdefgçë'
# There are 14 characters in s, but it contains 21 bytes
>>> len(s)
21
>>> s
'\xc3\xa1\xc3\xa9\xc3\xad\xc3\xb3\xc3\xbaabcdefg\xc3\xa7\xc3\xab'

# The first "character" (actually, byte) is unprintable.
>>> print s[0]
�
# So is the second.
>>> print s[1]
�
# But together they make up a character.
>>> print s[0:2]
á

因此打印单个字节无法按预期工作。

>>> for c in s:print c,
... 
� � � � � � � � � � a b c d e f g � � � �

但是将字符串解码为 un​​icode,然后打印。

>>> for c in s.decode('utf-8'):print c,
... 
á é í ó ú a b c d e f g ç ë

要使您的代码按预期工作,您需要对从文件中读取的字符串进行解码。改变

string = fp.read().replace('\n', '')

string = fp.read().replace('\n', '').decode('utf-8')

【讨论】:

    【解决方案2】:

    这取决于您使用的 Python 版本:

    1. 对于 python 2,没有对 Unicode 字符的原生支持,因此需要显式地保留,例如:

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

    2. 对于 python 3 支持是原生的,正如 here 所说。

    所以UTF-8 编码已经有了原生支持。

    【讨论】:

    • 问题是关于从文件中读取 Unicode。您的答案是在源代码中包含 Unicode 字符。两种完全不同的东西。
    • 对不起,我弄错了问题,并以误导的方式回答了它。
    猜你喜欢
    • 2013-12-09
    • 2017-11-19
    • 1970-01-01
    • 2011-11-12
    • 2017-09-26
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多