在Python中将Unicode字符串转换为字符串(包含额外符号)

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)

  • 他说他想保存它,而不是破坏它. (141认同)
  • +1回答问题的措辞,@ williamtroup的问题是无法将unicode保存到文件听起来像一个完全不同的问题值得单独的问题 (24认同)
  • @JohnMachin这个问题逐字回答:将'unicode`字符串转换为`str`的​​唯一**方法是删除或转换无法用ASCII表示的字符.所以来自我的+1. (13认同)
  • @Mark Roddy:他写的问题是如何将包含一些货币符号的"Unicode字符串"(无论他的意思是什么)转换为"Python字符串"(无论......),你认为删除一些变音符号删除 - 其他 - 非ascii字符kludge回答他的问题??? (10认同)
  • @John - 这个答案早于OP的澄清. (5认同)
  • @lzkata:不,不是.`type(title)== unicode和type(title.encode('utf-8'))== str`.无需破坏输入,获取可保存到文件的字节串. (3认同)
  • 这是一个彻头彻尾的尴尬.请不要随意摧毁外语中的部分字符.(例如,这将完全删除任何CJK文本.)修复破坏系统首先窒息它们的问题. (3认同)
  • 请不要使用此代码!完全删除德语"ß"等字符绝不会转换.这段代码将"Fuß"转换为"Fu"或"groß"为"gro",其中"Fu"和"gro"在德语中都没有任何意义.对于其中`Rødgrød`成为`Rdgrd`的其他语言也是如此. (3认同)
  • @Dominic:我很抱歉; 我会改写一下:OP的澄清问题说他想把它变成一个PYTHON STRING,而不是破坏它. (2认同)
  • 正如@JohnMachin暗示的那样,这个答案没有任何保留,显然是错误的**.请考虑投票**投票**. (2认同)
  • 为什么会有这么多的赞成?为什么它是公认的答案?这是从拉丁文本剥离变音符号的好方法,拉丁文本有其用途(例如,实现半天真的搜索功能),但它不是OP所要求的. (2认同)

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)

  • 很棒的答案.正是我需要的.此外,伟大的演示文稿,以显示`ignore` vs`replace`的效果 (4认同)

小智 130

>>> text=u'abcd'
>>> str(text)
'abcd'
Run Code Online (Sandbox Code Playgroud)

如果字符串仅包含ascii字符.

  • -1:`str(u'£10')` - >`UnicodeEncodeError` (36认同)
  • 这只适用于Windows.如果有非ascii符号,将会中断. (18认同)
  • 这个答案对我有帮助.如果您知道您的字符串是ascii并且您需要将其转换回非unicode字符串,这非常有用. (11认同)
  • 如果字符串的内容实际上是unicode,而不仅仅是unicode字符串中的ascii字符,则会中断.不要这样做,你会得到随机的UnicodeEncodeError异常. (6认同)

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)


mad*_*rdi 7

文件包含 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)

  • 即使我只使用:```result.encode().decode('unicode-escape')```它也有效 (6认同)

Cam*_*Cam 6

有一个名为ftfy的库可以帮助解决 Unicode 问题。让我的生活变得更轻松。

\n

实施例1

\n
import 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

\n
import 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代码点

\n
import ftfy\nprint(ftfy.fix_text(u\'\\u2026\'))\n\noutput -->\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n
\n

https://ftfy.readthedocs.io/en/latest/

\n
\n

pip 安装 ftfy

\n
\n

https://pypi.org/project/ftfy/

\n
\n


JAB*_*JAB 5

好吧,如果您愿意/准备切换到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,则问题可能与您尝试将文本保存到文件中有关。)

  • 在Python 3中,字符串是Unicode字符串。它们永远不会被编码。我发现以下文本很有用:http://www.joelonsoftware.com/articles/Unicode.html (2认同)