Convert a Unicode string to a string in Python (containing extra symbols)
如何将一个unicode字符串(包含额外的字符,如镑等)转换为python字符串?
- 你说的"Python串"是什么意思?是否要对Unicode字符串进行编码?
- 我正在从HTML窗口上的表单发送Unicode,该表单带有我希望能够保存到文件中的符号,但它不起作用。
- 我们需要知道您使用的是什么样的Python版本,以及您调用的是什么样的Unicode字符串。在包含引起问题的货币符号的短Unicode_字符串上执行以下操作:python 2.x:print type(unicode_string), repr(unicode_string)python 3.x:print type(unicode_string), ascii(unicode_string),然后编辑问题并复制/粘贴上述打印语句的结果。不要重新键入结果。还可以在HTML顶部附近查找,看看是否可以找到这样的内容:
- 你真的应该澄清你所说的unicode字符串和python字符串是什么意思(我想最好给出具体的例子),因为从注释中可以清楚地看到,你的问题有不同的解释。我想知道为什么你没有这样做,尽管你问这个问题已经超过3,5年了。
- @JALF:如果是编码的,它就不再是Unicode,例如unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')。
- @J.F.Sebastian:你的意思是"它不是python-unicode字符串数据类型"(这是不言而喻的,因为你通过网络套接字从HTTP请求接收到的是字节流,而不是python值),但是utf-8文本肯定是unicode。这就是UTF-8编码中的整点。
- @jalf:utf-8是字符编码。您可以使用它将字节序列解释为文本(Unicode代码点序列——您可以调用Unicode文本(它与Python无关))。字节序列本身不是Unicode字符串。
- @但我们不是在谈论"字节序列本身"。我们讨论的是一个编码为UTF-8的字符串。"编码为utf-8的字符串不可能是Unicode字符串,因为utf-8是Unicode编码。"它不编码汽车、日落、情绪或华夫饼。它编码Unicode文本。编码为UTF-8的文本是Unicode文本。我只是对您的错误陈述作出反应,"编码的字符串不再是Unicode"。
- @wnys(加上编码rot-13):让我们检查编码字符串是否与原始字符串相同。仅供参考,wnys是使用rot-13编码的jalf编码。
- 希望未来的路人能够理解,当你说某个东西是"编码的"时,你会说"它不是真正的东西,它是另一个东西的一种表示形式,我们可以用特定的限制来处理。"例如,使用UTF-8,这样C字符串处理实用程序"工作",尽管C不知道任何Unicode或UTF。
1 2 3 4
| 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' |
- 他说他想拯救它,而不是破坏它。
- +1按字面回答问题,@williamroup无法将unicode保存到文件中的问题听起来完全不同,值得单独提问。
- @约翰-这个答案早于行动党的澄清。
- @MarkRoddy:他写的问题是如何将包含一些货币符号的"unicode字符串"(不管他是什么意思)转换为"python字符串"(不管什么…),你认为删除一些音调符号会删除其他非ASCII字符Kludge回答他的问题????
- @多米尼克:我很抱歉,我要换个说法:OP的未分类问题说他想把它转换成一个python字符串,而不是把它弄乱。
- 注意normalize()不处理Unicode标点(例如,智能引号、撇号、破折号),可能是因为标点字符不是复合字符。这里有一个很好的讨论和替代解决方案:stackoverflow.com/a/816319/234823
- 正如@johnmachin所暗示的那样,这个答案毫无保留地显然是错误的。请考虑投票否决。
- @johnmachin这个问题逐字回答:将unicode字符串转换为str的唯一方法是删除或转换不能用ASCII表示的字符。所以从我身上得到1。
- @Piotrdorgost也看到了我之前的评论。
- @不,不是。type(title) == unicode and type(title.encode('utf-8')) == str。无需破坏输入,即可获取可保存到文件中的字节串。
- 为什么会有这么多的赞成票?为什么这是公认的答案?这是一种从拉丁语文本中去掉音调符号的好方法,拉丁语文本有它的用途(例如,实现半NA&239;ve搜索功能),但它不是OP要求的。
- 这完全是一种尴尬。请不要随意销毁部分外文文字。(例如,这将完全删除所有CJK文本。)首先修复所有被破坏的系统。
- @您也可以将一个未编码的字符串保存到一个文件中,大概吧,但是问题就变成了从该文件中检索字符串的问题之一。如果没有标准化的机制来解释该文件(例如,使用指定字符编码的XML),则所有赌注都将取消。现在,您可以假设utf-8,但不假设最初给我们8位字符的东西吗?
- 什么是NFKD(作为unicodedata.normalize的第一个论据)?
- @joshreesjones docs.python.org/2/library/…
- 好吧,我"听错了"最后到了这里,带着我要做的确切代码,所以…
- 请不要使用此代码!完全删除像德语"&223;"这样的字符是无法转换的。此代码"将"Fuß转换为Fu或groß转换为gro,其中Fu和gro在德语中没有任何含义。其他语言也是如此,其中Rødgrød变为Rdgrd。
- 这个答案确实不能回答这个问题。
- @JFS,当我的title.encode('utf-8')这个:u"Klüft skräms inför på fédéral électoral große"变成这个:"Kl├╝ft skr├ñms inf├╢r p├Ñ f├?d├?ral ├?lectoral gro├?e";这就是你所说的"bytestring"吗?在我看来,它"被弄坏了";我做错什么了吗?这是预期结果吗?
- @你做错了。结果是莫吉贝克。将Unicode文本写入python stackoverflow.com/a/35086151/4279中的文件
- @谢谢你。但我对写档案不感兴趣。OP没有提到写入文件。链接的答案显示如何将Unicode对象直接写入文件。但这个问题是关于字符串,而不是文件;我指的是您之前的注释type(title.encode('utf-8')) == str,当您在python 2中运行这个命令时,您能为我打印结果吗?如你所说,u"Klüft skräms inför på fédéral électoral große".encode('utf-8')和type(..)将是str,但是encode的结果是什么?你说"不需要破坏输入";我怎样才能避免mojibake/破坏输入?
- 我想用encode,即@jfs建议的u"Klüft".encode('utf-8'),将取代ü;结果是这个字符串:'Kl\xc3\xbcft'。图像在这里。打印后一个字符串,将显示为mojibake。解码后一个字符串将返回到unicode对象:u"Klüft"。答案如下。我想这就是@izkata所说的:"转换不能用ASCII表示的字符。"即u'ü'->'\xc3\xbc'。
- @Theredpea您注释中的mojibake表示您确实使用一个字符编码将文本(python 2上的unicode类型)编码为字节(python 2上的str类型),然后使用其他字符编码读取文件。如果要打印文本,请使用Unicode,不要过早编码为字节(链接答案的点)。如果要使用字节来表示文本(不应该),请使用相同的编码进行写入和读取(例如,如果设置为-yes,请参阅sys.stdout.encoding,sys.stdout是一个文件,打印时使用)。
- (例如,如果设置了,请参见sys.stdout.encoding-是,sys.stdout是一个文件,打印时使用它)。"太好了,谢谢。
你可以使用一个ASCII编码,如果您don’t需要翻译的非ASCII字符。
1 2 3 4 5 6 7 8
| >>> a=u"aaaà??????"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>> |
- 答案很棒。正是我需要的。同时,很好地展示了ignore与replace的效果。
- 或者,a.encode('ascii', 'xmlcharrefreplace')给'aaaàçççñññ'。
1 2 3
| >>> text=u'abcd'
>>> str(text)
'abcd' |
如果字符串只包含ASCII字符。
- 这只适用于Windows。如果存在非ASCII符号,则会断开。
- 如果字符串的内容实际上是Unicode,而不仅仅是Unicode字符串中的ASCII字符,则会中断。不要这样做,你会得到随机的unicodeencodeerror异常遍布各地。
- -1:str(u'£10')->UnicodeEncodeError。
- 这个答案对我有帮助。如果您知道您的字符串是ASCII,并且需要将其转换回非Unicode字符串,那么这非常有用。
如果你有一个Unicode字符串,你想写一本连载的形式或其他文件,第一,你必须是一个特定的编码表示的信息可以存储。有几个普通Unicode UTF-16编码,如(双字节的Unicode字符必须使用UTF-8)或(1,4字节/会取决于字符,字符串等),转换到一个特定的编码,你可以使用:
1 2 3 4 5
| >>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00' |
这个原始的字节串,可以写一个文件。然而,注意,当你阅读它回来,它是必须知道的编码和解码使用相同的信息编码。
当一个文件的写作,你可以摆脱本手册编码/解码过程使用的编解码器模块。因此,打开一个文件,encodes所有Unicode UTF-8字符串,使用:
1 2 3
| import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string) # Stored on disk as UTF-8 |
做的注意别的东西,是用什么编码进行文件必须明白,如果他们想要的是在文件的阅读。如果你是唯一一个做阅读/写作这本不是问题,确保你写什么,无论使用的其他形式的文件。
在Python 3,这是默认的文件访问的形式,和内置函数的编码参数,以open总是想和Unicode字符串翻译到/从(默认的字符串在Python对象(3)在文本文件的打开方式。
这里是一个例子:
1 2 3 4
| >>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac' |
- 有人能解释为什么,当我把欧元符号编码为utf8时,结果仅仅是问号吗?这是我的python版本2.7.13的图像。(我可以对其他Unicode对象(如u"Klüft")进行编码,但不能对欧元进行编码?)
嗯,如果你愿意/准备切换到Python 3(你可能不在一个向后的incompatibility尽职2一些Python代码),你不需要做任何转换;文本是所有Python的Unicode字符串代表3个,这意味着,所以没有更多的使用在u''语法。你要的是什么,事实上,字符串表示字节,这是用来代表数据(这可能是在编码的字符串)。
docs.python.org http:/ / / / / 3.0.html 3.1 whatsnew #文本和数据而不是学院的8位Unicode vs
(当然,如果你正在使用Python 3,那么问题可能是什么做的是你要如何拯救一个N的文本文件)。
- 在python中,3个字符串是unicode字符串。它们从不被编码。我发现以下文本很有用:joelonsoftware.com/articles/unicode.html
- 他想把它保存到一个文件里,你的回答对这个有什么帮助?
- @卢茨:对,我忘了Unicode是字符映射,而不是编码。@约翰:目前还没有足够的信息来知道保存它有什么问题。他出错了吗?他没有得到任何错误,但当从外部打开文件时,他得到了mojibake?没有这些信息,可能提供的解决方案太多了。
- @猫:现在没有任何信息可以知道他有什么,更不用说他的储蓄问题了。我要求他提供一些事实——看我的答案。
这里是一个示例代码
1 2 3
| import unicodedata
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore') |
1 2
| import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars |
- 虽然这个代码片段可以解决这个问题,但包含一个解释确实有助于提高文章的质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您的代码建议的原因。请不要用解释性的注释来填充代码,这会降低代码和解释的可读性!