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

2017-09-19 10:08:16 +08:00
 shayuvpn0001

在 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 高手能帮忙看看找个合适的方法。

3314 次点击
所在节点    程序员
10 条回复
zhoulv2012
2017-09-19 10:24:08 +08:00
尝试先 decode ?
albertofwb
2017-09-19 10:31:18 +08:00
我在 python3.4 中测试,可以直接 print(a.encode()) 实现你的要求
https://www.jianguoyun.com/p/DRPpH-0Qhp-3BhiKnjU
albertofwb
2017-09-19 10:35:34 +08:00
SmiteChow
2017-09-19 11:03:52 +08:00
```
print repr('你好')
```
shayuvpn0001
2017-09-19 11:20:46 +08:00
@albertofwb

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

Anyway,谢谢
shayuvpn0001
2017-09-19 11:21:03 +08:00
@SmiteChow 输出是汉字,版本 2.7,谢谢。
SmiteChow
2017-09-19 11:52:21 +08:00
@shayuvpn0001
```
>>> print repr('你好')
'\xe4\xbd\xa0\xe5\xa5\xbd'
```
albertofwb
2017-09-19 12:17:05 +08:00
@shayuvpn0001 你看看第二个方法里面的第二个链接,需要做一点替换就能达到要求
shayuvpn0001
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
2017-09-20 12:01:25 +08:00
u"""
balabala
呵呵呵哈哈哈哈
""""

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/391873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX