字符串格式转换

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

字符串格式转换

#1

帖子 d313206775 » 2016-12-16 9:48

我现在有些字符串是ASCII码和unicode格式混编的,例如下面:
a = "\u5317\u4eacabc"
我想转化为 a = "北京abc"
请问这该怎么转。
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

Re: 字符串格式转换

#2

帖子 HuntXu » 2016-12-16 10:48

以前写的

代码: 全选

$ echo "\u5317\u4eacabc" | perl -MEncode -pe  's/\\u([0-9a-fA-F]{4})/encode("utf8", pack("U", hex($1)))/eg'
北京abc
HUNT Unfortunately No Talent...
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: 字符串格式转换

#3

帖子 oneleaf » 2016-12-16 11:22

代码: 全选

>>> a = u'\u5317\u4eacabc'
>>> print a.encode("utf-8")
北京abc
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

Re: 字符串格式转换

#4

帖子 d313206775 » 2016-12-16 11:30

oneleaf 写了:

代码: 全选

>>> a = u'\u5317\u4eacabc'
>>> print a.encode("utf-8")
北京abc
现在我的字符串是不带前面那个‘u’,就单独是 a = '\u5317\u4eacabc'
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

Re: 字符串格式转换

#5

帖子 d313206775 » 2016-12-16 11:34

HuntXu 写了:以前写的

代码: 全选

$ echo "\u5317\u4eacabc" | perl -MEncode -pe  's/\\u([0-9a-fA-F]{4})/encode("utf8", pack("U", hex($1)))/eg'
北京abc
试了下,结果是正确的。
初学者,不知道如何改成函数。
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

Re: 字符串格式转换

#6

帖子 d313206775 » 2016-12-16 11:36

HuntXu,
能给改成函数吗,初学者,看不懂
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: 字符串格式转换

#7

帖子 oneleaf » 2016-12-16 11:41

代码: 全选

>>> a = "\u5317\u4eacabc"
>>> print a.decode('unicode-escape').encode("utf-8")
北京abc
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

Re: 字符串格式转换

#8

帖子 d313206775 » 2016-12-16 13:49

oneleaf,
用print是成功了。但我将经过转化的字符串用logging打印下来后,就还是错误的。
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: 字符串格式转换

#9

帖子 oneleaf » 2016-12-16 16:58

如何错误?文件的编码是什么?
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

Re: 字符串格式转换

#10

帖子 d313206775 » 2016-12-16 18:05

oneleaf,
打印下来的内容为:

代码: 全选

temp_project>:114] the unicode--title is: \u97f5\u52a8\u4e2d\u56fd China in Motion 2015
[I 161216 13:37:31 <temp_project>:116] the title is: \u97f5\u52a8\u4e2d\u56fd China in Motion 2015
[I 161216 13:37:31 <temp_project>:114] the unicode--title is: \u4e2d\u56fd
[I 161216 13:37:31 <temp_project>:116] the title is: \u4e2d\u56fd
文档编码格式为:utf-8
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: 字符串格式转换

#11

帖子 oneleaf » 2016-12-16 18:22

试试:

直接写入 a.decode('unicode-escape')
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

Re: 字符串格式转换

#12

帖子 d313206775 » 2016-12-16 19:17

oneleaf,
能试的都试了一遍了。
现在就是在想为啥 print就可以。

刚才发现了这么个有意思的事:

代码: 全选

>>> a = "\u0026"
>>> b = a.decode('unicode-escape').encode('utf-8')
>>> b
'&'
>>> aa = "\u82f1"
>>> bb = aa.decode('unicode-escape').encode('utf-8')
>>>bb
'\xe8\x8b\xb1'
>>> print bb
英
>>> 
后来又试了试 \u00开头的字符,都能够正常输出。但其他开头的unicode字符,就输出又问题。
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

Re: 字符串格式转换

#13

帖子 d313206775 » 2016-12-16 19:31

d313206775, oneleaf,
后来仔细比对了下,只有原来是ASCII码对应的那些字符,转化为unicode编码后,最后才会显示成功。其他字符则最终会转化失败。
头像
b33e
帖子: 3864
注册时间: 2011-06-07 14:20
系统: Mint18

Re: 字符串格式转换

#14

帖子 b33e » 2016-12-16 21:26

python3:

代码: 全选

In [1]: a=bytes(u'\u5317\u4eacabc','utf-8').decode('utf-8')

In [2]: a
Out[2]: '北京abc'
d313206775
帖子: 15
注册时间: 2016-12-12 14:30
系统: ubuntu 14.04

Re: 字符串格式转换

#15

帖子 d313206775 » 2016-12-20 14:54

b33e,
我用的是python2.7,没有bytes函数。另外,我的字符串格式为:'\u5317\u4eacabc',不是u'\u5317\u4eacabc',前面不带u
回复