假设现在有数组
arr = [96, 79, 125, 89]
数组内的每个数的 16 进制数分别为 60, 4f, 7d, 59
而字符串“你好”的 unicode 编码是 '\u4f60\u597d'
问:怎么将十进制数组转换成 unicode 字符?(希望是由内置的函数去转换,手动拼接的话太蓝瘦了)
详情:这是我在通过 pywin32 的 SendMessage 获取文本框内容时遇到的问题,因为因为是用 PyBuffer 来接收返回的内容,所以得到的是一个数组,很纠结怎么转换成字符
1
raysonx 2016-12-13 15:02:05 +08:00 3
~> python3
Python 3.5.2 (default, Sep 14 2016, 11:28:32) [GCC 6.2.1 20160901 (Red Hat 6.2.1-1)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import struct >>> arr = [96, 79, 125, 89] >>> struct.pack('B' * len(arr), *arr).decode('utf-16') '你好' >>> |
2
raysonx 2016-12-13 15:02:54 +08:00 1
或者直接
>>> bytes(arr).decode('utf-16') '你好' |
3
raysonx 2016-12-13 15:06:51 +08:00 3
需要澄清的一個問題是,「字符串“你好”的 unicode 编码是 '\u4f60\u597d'」表述有誤。
Unicode 是字符集,它只負責對每一個符號賦於一個編號,並不關心這個符號的二進制表示行式。 而樓主的需求是,對一串 bytes 按 UTF-16 進行解碼( decode )。 Unicode 是字符集(charset), UTF 是編碼(encoding),不要搞混了。 |
5
imn1 2016-12-13 15:15:18 +08:00
如楼上所述, unicode 是个字符集,是个“类映射表”概念, ucs2, utf-7/8/16/32 等等才能称为编码
一般处理字符串的话, 2L 所写 bytes 比较方便,但主楼所写场景,如果考虑有可能其他混合数据, 1L 所写 struct 可能更适合 |
6
raysonx 2016-12-13 15:23:00 +08:00
哦對了, UTF-16 有一個討厭的問題,就是分大小端序( endianness )。
題主的例子是小端序(little endian , UTF-16LE)的,即每一個字符低位 byte 在前,高位 byte 在後(「你好」對應 60, 4f, 7d, 59 )。 還有一種是大端序(big endian , UTF-16BE),即每一個字符高位 byte 在前,低位 byte 在後(「你好」對應 4f, 60, 59, 7d )。 同樣的, UTF-32 也分大小端序。不過 UTF-8 不分大小端序。 |