V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
toono
V2EX  ›  Python

python3 编码转换问题😂十进制数组转 unicode

  •  
  •   toono ·
    ToonoW · 2016-12-13 14:56:15 +08:00 · 4000 次点击
    这是一个创建于 2684 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设现在有数组 arr = [96, 79, 125, 89]

    数组内的每个数的 16 进制数分别为 60, 4f, 7d, 59

    而字符串“你好”的 unicode 编码是 '\u4f60\u597d'

    问:怎么将十进制数组转换成 unicode 字符?(希望是由内置的函数去转换,手动拼接的话太蓝瘦了)

    详情:这是我在通过 pywin32 的 SendMessage 获取文本框内容时遇到的问题,因为因为是用 PyBuffer 来接收返回的内容,所以得到的是一个数组,很纠结怎么转换成字符

    8 条回复    2016-12-13 15:39:49 +08:00
    raysonx
        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')
    '你好'
    >>>
    raysonx
        2
    raysonx  
       2016-12-13 15:02:54 +08:00   ❤️ 1
    或者直接
    >>> bytes(arr).decode('utf-16')
    '你好'
    raysonx
        3
    raysonx  
       2016-12-13 15:06:51 +08:00   ❤️ 3
    需要澄清的一個問題是,「字符串“你好”的 unicode 编码是 '\u4f60\u597d'」表述有誤。
    Unicode 是字符集,它只負責對每一個符號賦於一個編號,並不關心這個符號的二進制表示行式。
    而樓主的需求是,對一串 bytes 按 UTF-16 進行解碼( decode )。
    Unicode 是字符集(charset), UTF 是編碼(encoding),不要搞混了。
    toono
        4
    toono  
    OP
       2016-12-13 15:14:16 +08:00
    @raysonx 嗯嗯,谢谢耐心科普!!!!
    imn1
        5
    imn1  
       2016-12-13 15:15:18 +08:00
    如楼上所述, unicode 是个字符集,是个“类映射表”概念, ucs2, utf-7/8/16/32 等等才能称为编码

    一般处理字符串的话, 2L 所写 bytes 比较方便,但主楼所写场景,如果考虑有可能其他混合数据, 1L 所写 struct 可能更适合
    raysonx
        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 不分大小端序。
    toono
        7
    toono  
    OP
       2016-12-13 15:38:01 +08:00
    @imn1 嗯嗯, 1L 和 2L 的方法都方便,我暂时还没有数据混合,所以 2L 的够用了。你们这些概念好透彻啊,我是刚从事 python 开发,太小白了。
    toono
        8
    toono  
    OP
       2016-12-13 15:39:49 +08:00
    @raysonx 对,我也发现了,所以如果实在没有办法了,就先将两个整数换顺序,然后转到 16 进制,再拼接成 unicode 字符的表示形式😛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   909 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 20:59 · PVG 04:59 · LAX 13:59 · JFK 16:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.