Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.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
Python反转UTF-8字符串_Python_String_Utf 8_Character_Reverse - Fatal编程技术网

Python反转UTF-8字符串

Python反转UTF-8字符串,python,string,utf-8,character,reverse,Python,String,Utf 8,Character,Reverse,我目前正在学习Python,作为斯洛文尼亚人,我经常使用UTF-8字符来测试我的程序。正常情况下,一切正常,但有一个我追不上。即使我在文件顶部声明了编码,当我试图反转包含特殊字符的字符串时,它也会失败 #-*- coding: utf-8 -*- a = "čšž" print a #prints čšž b = a[::-1] print b #prints �šō� instead of žšč 有没有办法解决这个问题?Python 2字符串是字节字符串,UTF-8编码的文本

我目前正在学习Python,作为斯洛文尼亚人,我经常使用UTF-8字符来测试我的程序。正常情况下,一切正常,但有一个我追不上。即使我在文件顶部声明了编码,当我试图反转包含特殊字符的字符串时,它也会失败

#-*- coding: utf-8 -*-

a = "čšž"
print a    #prints čšž
b = a[::-1]
print b    #prints �šō� instead of žšč
有没有办法解决这个问题?

Python 2字符串是字节字符串,UTF-8编码的文本每个字符使用多个字节。仅仅因为终端能够将UTF-8字节解释为字符,并不意味着Python知道一个UTF-8字符由哪些字节组成

您的bytestring由6个字节组成,每两个字节组成一个字符:

>>> a = "čšž"
>>> a
'\xc4\x8d\xc5\xa1\xc5\xbe'
但是,UTF-8使用的字节数取决于Unicode标准中字符的定义位置;ASCII字符(Unicode标准中的前128个字符)每个字符只需要1个字节,而许多表情符号需要4个字节

在UTF-8中,顺序就是一切;通过testring反转上述字节,就UTF-8标准而言会产生一些混乱,但中间的4个字节恰好是有效的UTF-8序列(对于
š
ō
):

您必须将字节字符串解码为
unicode
对象,该对象由单个字符组成。反转该对象可获得正确的结果:

b = a.decode('utf8')[::-1]
print b
您始终可以再次将对象编码回UTF-8:

b = a.decode('utf8')[::-1].encode('utf8')
请注意,在Unicode中,在使用时反转文本仍可能遇到问题。使用组合字符反转文本会将这些组合字符放在它们组合的字符前面,而不是后面,因此它们会与错误的字符组合:

>>> print u'e\u0301a'
éa
>>> print u'e\u0301a'[::-1]
áe

您可以通过将Unicode数据转换为其标准化形式(用1-codepoint形式替换组合)来避免这种情况,但还有大量其他异国情调的Unicode字符不能很好地处理字符串反转。

仅澄清一下:“但是还有很多其他异国情调的Unicode字符不能与字符串反转交互”意思是“不能很好地处理字符串反转”或“不受字符串反转的影响”?@Piovezan:我自己也不是100%确定;我要用“不能很好地处理字符串反转”。
>>> print u'e\u0301a'
éa
>>> print u'e\u0301a'[::-1]
áe