V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shayuvpn0001
V2EX  ›  程序员

Python 如何实现 IDLE 中打印 unicode 编码的样式?

  •  
  •   shayuvpn0001 · 2017-09-19 10:08:16 +08:00 · 3320 次点击
    这是一个创建于 2626 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 IDLE 中可以直接将 unicode 字符按'\xaa\xbb'这种格式输出,如下所示

    | >>> s = u'熊猫'
    | >>> s.encode('utf-8')
    '\xc3\x90\xc3\x9c\xc3\x83\xc2\xa8'
    | >>>

    现在有一个比较特殊的需求,需要编写的 python 脚本用 print 按这个格式输出,在 Stackoverflow 上找了一圈又 google 了半天,进行了下列尝试:

    1,直接 print s.encode('utf-8'),直接输出了'熊猫'

    2,使用 join kwd = u'熊猫' print ' '.join(hex(ord(kwdChar)) for kwdChar in kwd)

    输出结果是:0x718a 0x732b

    此外还发现 kwd = '熊猫'执行的结果跟加了 u 的 unicode 不一样,应该是被当作了 string 了吧。 kwd = '熊猫'的结果是:0xe7 0x86 0x8a 0xe7 0x8c 0xab

    其他陆续也在网上找了不少资料,包括介绍 unicode 编码以及 python 2.x 与 unicode 之间的各种问题的文章,但好像都没办法实现这个需求。客户催的也比较急,想问问 v2 上有没有 python 高手能帮忙看看找个合适的方法。

    10 条回复    2017-09-20 12:01:25 +08:00
    zhoulv2012
        1
    zhoulv2012  
       2017-09-19 10:24:08 +08:00 via Android
    尝试先 decode ?
    albertofwb
        2
    albertofwb  
       2017-09-19 10:31:18 +08:00
    我在 python3.4 中测试,可以直接 print(a.encode()) 实现你的要求
    https://www.jianguoyun.com/p/DRPpH-0Qhp-3BhiKnjU
    SmiteChow
        4
    SmiteChow  
       2017-09-19 11:03:52 +08:00
    ```
    print repr('你好')
    ```
    shayuvpn0001
        5
    shayuvpn0001  
    OP
       2017-09-19 11:20:46 +08:00
    @albertofwb

    当前用的版本是 2.7,这两个方法都不行,第一个方法打印出来是汉字,第二个方法打印出来没有\x 开头,是 948b23 这种缩在一起的。

    Anyway,谢谢
    shayuvpn0001
        6
    shayuvpn0001  
    OP
       2017-09-19 11:21:03 +08:00
    @SmiteChow 输出是汉字,版本 2.7,谢谢。
    SmiteChow
        7
    SmiteChow  
       2017-09-19 11:52:21 +08:00
    @shayuvpn0001
    ```
    >>> print repr('你好')
    '\xe4\xbd\xa0\xe5\xa5\xbd'
    ```
    albertofwb
        8
    albertofwb  
       2017-09-19 12:17:05 +08:00 via Android
    @shayuvpn0001 你看看第二个方法里面的第二个链接,需要做一点替换就能达到要求
    shayuvpn0001
        9
    shayuvpn0001  
    OP
       2017-09-19 14:14:28 +08:00
    @albertofwb 谢谢,第二个执行结果跟你贴图一致,有个小问题是最前面查个\x,代码: <br>
    s = '呵呵' <br>
    print "\\x".join("{:02x}".format(ord(c)) for c in s) <br>
    print repr(s) <br>
    s = u'呵呵' <br>
    print "\\x".join("{:02x}".format(ord(c)) for c in s) <br>
    print repr(s) <br>
    s = '呵' <br>
    print "\\x".join("{:02x}".format(ord(c)) for c in s) <br>
    print repr(s) <br>
    s = u'呵' <br>
    print "\\x".join("{:02x}".format(ord(c)) for c in s) <br>
    print repr(s) <br>

    结果: <br>
    e5\x91\xb5\xe5\x91\xb5 <br>
    '\xe5\x91\xb5\xe5\x91\xb5' <br>
    5475\x5475 <br>
    u'\u5475\u5475' <br>
    e5\x91\xb5 <br>
    '\xe5\x91\xb5' <br>
    5475 <br>
    u'\u5475' <br>


    @SmiteChow 我的 python 2.7 + Debian 8.6,代码: <br>
    print repr(kwd) <br>
    print repr(kwd.encode('utf-8')) <br>
    print repr(kwd.encode('utf-8').encode('hex')) <br>

    结果: <br>
    u'\u7075' <br>
    '\xe7\x81\xb5' <br>
    'e781b5' <br>

    跟客户又沟通了一下,其实他是怕 unicode 字符输出有问题,打印了方便测试人员(外包给阿三了)比对,所以才要这个效果。他其实更关心的是 unicode 在 mysql 中存储的问题,这些需要处理的 unicode 编码文字要存到 mysql 的 keyword 字段,刚开始用的是 utf8_general_ui 存储,该字段有 UNIQUE 的索引,出现了大写 G 和小写 g 被认为是同一字符而引发了插入错误。后来改成了 utf8_bin,大小写问题解决,但是还是有部分转义字符报错,他想把这些有问题的按字节打印输出方便测试检查。

    PS:如果实在是有些很奇葩的语言,比如北欧国家使用的字符,东南亚、阿拉伯使用的字符,开一个新的单独字段专门存\xe5\x91\xb5 字节码,能解决他这个 UNIQUE 的索引问题么?

    谢谢
    artandlol
        10
    artandlol  
       2017-09-20 12:01:25 +08:00
    u"""
    balabala
    呵呵呵哈哈哈哈
    """"
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1199 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:22 · PVG 07:22 · LAX 15:22 · JFK 18:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.