
假设现在有数组 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 ~> 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 或者直接 >>> bytes(arr).decode('utf-16') '你好' |
3 raysonx 2016-12-13 15:06:51 +08:00 需要澄清的一是,「字符串“你好”的 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 不分大小端序。 |