Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Unicode字符串转换为Python中的字符串(包含额外符号)_Python_String_Unicode_Type Conversion - Fatal编程技术网

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

将Unicode字符串转换为Python中的字符串(包含额外符号),python,string,unicode,type-conversion,Python,String,Unicode,Type Conversion,如何将Unicode字符串(包含“$”等额外字符)转换为Python字符串?请参见 以下是一个例子: >>> u = u'€€€' >>> s = u.encode('utf8') >>> s '\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac' 好的,如果您愿意/准备切换到Python3(这可能不是因为与某些Python2代码向后不兼容),那么您不必进行任何转换;Python 3中的所有文本都用Unicode字符串

如何将Unicode字符串(包含“$”等额外字符)转换为Python字符串?

请参见

以下是一个例子:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

好的,如果您愿意/准备切换到Python3(这可能不是因为与某些Python2代码向后不兼容),那么您不必进行任何转换;Python 3中的所有文本都用Unicode字符串表示,这也意味着不再使用
u'
语法。实际上,您还有用于表示数据(可能是编码字符串)的字节字符串


(当然,如果您当前使用的是Python 3,那么问题可能与如何将文本保存到文件有关。)

如果您有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'
这个原始字节字符串可以写入文件。然而,请注意,当读回它时,您必须知道它的编码是什么,并使用相同的编码对其进行解码

在写入文件时,您可以使用该模块摆脱这种手动编码/解码过程。因此,要打开将所有Unicode字符串编码为的文件,请使用:

请注意,如果要读取这些文件,使用这些文件的任何其他人都必须了解文件的编码。如果你是唯一一个进行读/写操作的人,那么这不是问题,否则,请确保你以任何其他使用文件的人都能理解的形式编写


在Python 3中,这种形式的文件访问是默认的,内置的
open
函数将接受一个编码参数,并且对于以文本模式打开的文件,始终转换为Unicode字符串(Python 3中的默认字符串对象)。如果不需要转换非ASCII字符,则可以使用encode to ASCII:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
>a=u“aaaáçççññ”
>>>类型(a)
>>>a.encode('ascii','ignore')
“aaa”
>>>a.encode('ascii','replace')
“aaa级”
>>>

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

下面是一个示例代码

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')

在我的例子中,没有使用ANS,我有一个包含unicode字符的字符串变量,这里没有解释编码-解码

如果我在候机楼

echo "no me llama mucho la atenci\u00f3n"

输出正确:

output: no me llama mucho la atención
但是使用加载此字符串变量的脚本不起作用

这就是我的案例所起的作用,以防对任何人有所帮助:

string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención

文件包含unicode esaped字符串

\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",
对我来说

 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'

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

示例1

import ftfy
print(ftfy.fix_text('ünicode'))

output -->
ünicode
示例2-UTF-8

import ftfy
print(ftfy.fix_text('\xe2\x80\xa2'))

output -->
•
示例3-Unicode 代码点

import ftfy
print(ftfy.fix_text(u'\u2026'))

output -->
…

pip安装ftfy


+1用文字回答了这个问题,@williamtroup无法将unicode保存到文件的问题听起来像是一个完全不同的问题,值得单独讨论question@John-这个答案早于OP的澄清。@马克·罗迪:他写的问题是如何转换“Unicode字符串”(不管他是什么意思)包含一些货币符号到“Python字符串”(无论什么…)你认为删除一些发音符号删除其他非ascii字符克鲁奇回答了他的问题?@JohnMachin这逐字回答了这个问题:将
unicode
字符串转换为
str
字符串的唯一方法是删除或转换ascii中无法表示的字符。所以+1来自我。@lzkata:不,不是<代码>类型(title)=unicode和类型(title.encode('utf-8'))==str。无需破坏输入,即可获得可保存到文件中的bytestring。在Python中,3个字符串是Unicode字符串。它们从不被编码。我发现以下文字很有用:他想把它保存到一个文件中;你的答案有什么帮助?@lutz:对,我忘了Unicode是字符映射而不是编码@约翰:目前没有足够的信息来知道保存它有什么问题。他有错误吗?他没有收到任何错误,但是当从外部打开文件时,他收到了mojibake?没有这些信息,就有太多可能的解决方案。@Cat:目前没有任何信息可以知道他得到了什么,更不用说他的储蓄问题了。我要求他提供一些事实——请看我的答案。我们需要知道您使用的是什么Python版本,以及您调用的Unicode字符串是什么。对包含引起麻烦的货币符号的短unicode字符串执行以下操作:Python 2.x:
打印类型(unicode字符串)、repr(unicode字符串)
Python 3.x:
打印类型(unicode字符串)、ascii(unicode字符串)
,然后编辑您的问题并复制/粘贴上述打印语句的结果。不要重新键入结果。也可以在HTML顶部附近查找,看看是否可以找到这样的内容:我怀疑您是否可以从web请求中获得unicode。您可能会得到UTF-8编码的Unicode。@lutz:“UTF-8编码的Unicode”不是Unicode到底是什么意思?您应该真正澄清Unicode字符串和python字符串的含义(我想最好给出具体的示例),因为从评论中可以清楚地看出,您的问题有不同的解释。我想知道为什么你没有这样做,尽管你问这个问题已经超过3,5年了。@jalf:如果它是编码的;它不再是Unicode,例如,
Unicode\u string=u“我是Unicode字符串”;bytestring=unicode_string.encode('utf-8');unicode\u再次=bytestring.decode('utf-8')
这只在Windows上有效
 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'
import ftfy
print(ftfy.fix_text('ünicode'))

output -->
ünicode
import ftfy
print(ftfy.fix_text('\xe2\x80\xa2'))

output -->
•
import ftfy
print(ftfy.fix_text(u'\u2026'))

output -->
…