python与编码

Python中的文字对象

Python 3.x中处理文字的对象有str, bytes, bytearray。

  • bytes和bytearray可以使用除了用作格式化的方法(format, format_map)以及几个特殊的基于Unicode的方法(casefold, isdecimal, isidentifier, isnumeric, isprintable, encode)以外几乎所有str的方法。
  • bytes有一个类方法,可以通过序列来构建字符串,而这个方法不可以用在str上。

    Unicode和字符转换

    采用chr可以把一个Unicode的code point转换为字符,通过ord可以进行反向操作。

len函数计算的是字符数,不是字节数

Python与编码

Python内部处理编码的方式

在Python接受我们的输入时,总是会先转为Unicode。而且这个过程越早越好。
然后Python的处理总是对Unicode进行的,在这个过程中,一定不要进行编码转换的工作。
在Python向我们返回结果时,总是会从Unicode转为我们需要的编码。而且这个过程越晚越好。

Python源码的编码方式

Python默认使用utf-8编码。
如果想使用一种不同的编码方式来保存Python代码,我们可以在每个文件的第一行或者第二行(如果第一行被hash-bang命令占用了)放置编码声明(encoding declaration)
# ‐*‐ coding: windows‐1252 ‐*‐

Python中使用的编码

以上是在Windows中的测试结果,如果在GNU/Linux或者OSX中,那么所有的结果都是UTF-8.
关于mbcs和utf-8的区别,可以参考http://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows

文件读写的编码

从上面的例子可以看出,无论什么时候都不要使用默认的编码,因为在不同的机器上运行的时候会出现意想不到的问题。

Python如何处理来自Unicode的麻烦

Python总是通过code point来比较字符串的大小,或者是否相等的。

  • Unicode中重音符号有两种表示方法,用一个字节表示,或者用基字母加上重音符号表示,在Unicode中他们是相等的,但是在Python中由于通过code point来比较大小,所以就不相等了。

    解决方法是通过unicodedata库中的normalize函数,该函数的第一个参数可以接受”NFC”,’NFD’,’NFKC’,’NFKD’四个参数中的一个。
    NFC(Normalization Form Canonical Composition):以标准等价方式来分解,然后以标准等价重组之。若是singleton的话,重组结果有可能和分解前不同。尽可能的缩短整个字符串的长度,所以会把’eu0301’2个字节压缩到一个字节’é’。
    NFD(Normalization Form Canonical Decomposition):以标准等价方式来分解
    NFKD(Normalization Form Compatibility Decomposition):以相容等价方式来分解
    NFKC(Normalization Form Compatibility Composition):以相容等价方式来分解,然后以标准等价重组之。
    NFKC和NFKD可能会引起数据损失。

西方的键盘通常会键入尽可能短的字符串,也就是说和”NFC”的结果一致,但是通过”NFC”来操作一下再比较字符串是否相等比较安全。且W3C建议使用”NFC”的结果。

  • 同样的一个字符在Unicode中有两个不同的编码。
    该函数会把一个单一的Unicode字符转为另一个Unicode字符。

    又比如

    再一个例子
  • 有时候我们希望使用不区分大小写的形式进行比较
    使用方法str.casefold(),该方法会把大写字母转换为小写进行比较,比如’A’会转为’a’,’MICRO SIGN’的’µ’会转换为’GREEK SMALL LETTER MU’的’µ’
    在绝大部分(98.9%)情况下str.casefold()和str.lower()的结果一致。
  • 文字排序
    由于不同的语言规则,如果单纯按照Python的比较code point的方式进行,那么会出现很多不是用户期望的结果。
    通常采用locale.strxfrm进行排序。

    编码解码错误

    如果是Python源码中出现了解码错误,那么会产生SyntaxError异常。
    其他情况下,如果发现编码解码错误,那么会产生UnicodeEncodeError, UnicodeDecodeError异常。

几个摘自fluent python中的有用方法

编码探嗅Chardet

这是Python的标准模块。

参考资料:

  1. http://blog.csdn.net/tcdddd/article/details/8191464
2 2 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部