wil*_*oup 486 python string unicode type-conversion
如何将Unicode字符串(包含££等额外字符)转换为Python字符串?
Sor*_*tis 555
title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'
Run Code Online (Sandbox Code Playgroud)
Fer*_*ran 312
如果不需要翻译非ASCII字符,可以使用encode to ASCII:
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
Run Code Online (Sandbox Code Playgroud)
小智 130
>>> text=u'abcd'
>>> str(text)
'abcd'
Run Code Online (Sandbox Code Playgroud)
如果字符串仅包含ascii字符.
Bri*_*ian 112
如果您有Unicode字符串,并且想要将其写入文件或其他序列化表单,则必须先将其编码为可以存储的特定表示形式.有几种常见的Unicode编码,如UTF-16(使用对于大多数Unicode字符两个字节)或UTF-8(1-4字节/根据字符码点)等.为了该字符串转换成特定的编码,则可以使用:
>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'
Run Code Online (Sandbox Code Playgroud)
这个原始字节串可以写入文件.但请注意,在阅读它时,您必须知道它所使用的编码并使用相同的编码对其进行解码.
写入文件时,您可以使用编解码器模块摆脱此手动编码/解码过程.因此,要打开将所有Unicode字符串编码为UTF-8的文件,请使用:
import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string) # Stored on disk as UTF-8
Run Code Online (Sandbox Code Playgroud)
请注意,使用这些文件的任何其他内容必须了解文件的编码方式,如果他们想要阅读它们.如果您是唯一一个读/写的人,这不是问题,否则请确保您使用其他任何使用该文件的形式都可以理解.
在Python 3中,这种形式的文件访问是默认的,并且内置open
函数将采用编码参数并始终转换为/在Unicode文本模式下打开的文件的Unicode字符串(Python 3中的默认字符串对象).
Bas*_*ard 57
这是一个例子:
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
Run Code Online (Sandbox Code Playgroud)
文件包含 unicode-esaped 字符串
\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",
Run Code Online (Sandbox Code Playgroud)
为了我
f = open("56ad62-json.log", encoding="utf-8")
qq=f.readline()
print(qq)
{"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}
(qq.encode().decode("unicode-escape").encode().decode("unicode-escape"))
# '{"log":"message": "??????????? ????????????"}\n'
Run Code Online (Sandbox Code Playgroud)
有一个名为ftfy的库可以帮助解决 Unicode 问题。让我的生活变得更轻松。
\n实施例1
\nimport ftfy\nprint(ftfy.fix_text(\'u\xc3\x8c\xcb\x86nicode\'))\n\noutput -->\n\xc3\xbcnicode\n
Run Code Online (Sandbox Code Playgroud)\n示例 2 - UTF-8
\nimport ftfy\nprint(ftfy.fix_text(\'\\xe2\\x80\\xa2\'))\n\noutput -->\n\xe2\x80\xa2\n
Run Code Online (Sandbox Code Playgroud)\n示例 3 - Unicode\n代码点
\nimport ftfy\nprint(ftfy.fix_text(u\'\\u2026\'))\n\noutput -->\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n
pip 安装 ftfy
\n\n\n\n
好吧,如果您愿意/准备切换到Python 3(可能不是由于与某些Python 2代码的向后不兼容),则不必进行任何转换。Python 3中的所有文本均以Unicode字符串表示,这也意味着不再使用该u'<text>'
语法。实际上,您还有字节字符串,用于表示数据(可以是编码字符串)。
http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8位
(当然,如果您当前使用的是Python 3,则问题可能与您尝试将文本保存到文件中有关。)