Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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 windows上带cp1251和utf-8的Unicode_Python_Python 2.7_Unicode_Encoding - Fatal编程技术网

Python windows上带cp1251和utf-8的Unicode

Python windows上带cp1251和utf-8的Unicode,python,python-2.7,unicode,encoding,Python,Python 2.7,Unicode,Encoding,我正在python中使用unicode 因此有一个简单的脚本: # -*- coding: cp1251 -*- print 'юникод'.decode('cp1251') print unicode('юникод', 'cp1251') print unicode('юникод', 'utf-8') 在cmd中,我已将编码切换到活动代码页:1251 还有输出: СЋРЅРёРєРѕРґ СЋРЅРёРєРѕРґ юникод 我有点困惑 因为我已经为cp1251指定了编码,所以我

我正在python中使用unicode

因此有一个简单的脚本:

# -*- coding: cp1251 -*-

print 'юникод'.decode('cp1251')
print unicode('юникод', 'cp1251')
print unicode('юникод', 'utf-8')
在cmd中,我已将编码切换到活动代码页:1251

还有输出:

СЋРЅРёРєРѕРґ
СЋРЅРёРєРѕРґ
юникод
我有点困惑

因为我已经为cp1251指定了编码,所以我希望它能够被正确解码

但结果是一些垃圾代码点被解释了。 我知道“ююааа”只是一个字节,类似于: “\xd1\x8e\xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xb4”

但有一种方法可以在使用cp1251的终端中获得正确的输出? 我应该手动生成字节字符串吗


好像我误解了什么。我想我能理解你发生了什么事。最后一行给了我提示,你的垃圾代码点已经确认了。您尝试显示cp1251字符,但编辑器配置为使用utf8

-*-编码:cp1251-*-仅由Python解释器用于转换ASCII范围之外的源Python文件中的字符。不管怎样,它只用于unicode,因为来自原始源的字节给出了。。。字节字符串中的字节完全相同。一些文本编辑器非常友好,可以自动使用这一行,但我对此不太自信,例如,当我使用gvim时,总是手动切换到正确的编码。短篇故事:-*-编码:cp1251-*-在您的代码中未使用,并且只会误导读者,因为它不是实际的编码

如果您想确定源代码中的内容,最好使用显式转义。在代码页1251中,这个单词由以下字符组成:'\xfe\xed\xe8\xea\xee\xe4'

如果您编写此源代码:

txt = '\xfe\xed\xe8\xea\xee\xe4'
print txt
print txt.decode('cp1251')
print unicode(txt, 'cp1251')
print unicode(txt, 'utf-8')
并在配置为使用CP1251字符集的控制台中执行,前三行将输出ююааа,最后一行将抛出UnicodeDecodeError异常,因为输入不再有效“utf8”

或者,如果您对当前的编辑器感到满意,您可以编写:

# -*- coding: utf8 -*-

txt = 'юникод'.decode('utf8').encode('cp1251') # or simply txt = u'юникод'.encode('cp1251')
print txt
print txt.decode('cp1251')
print unicode(txt, 'cp1251')
print unicode(txt, 'utf-8')
这应该会得到相同的结果——但是现在声明的源代码应该是python源代码的实际编码

顺便说一句,本机使用unicode的Python 3.5 IDLE确认:

>>> 'СЋРЅРёРєРѕРґ'.encode('cp1251').decode('utf8')
'юникод'

我想我能理解你的遭遇。最后一行给了我提示,你的垃圾代码点已经确认了。您尝试显示cp1251字符,但编辑器配置为使用utf8

-*-编码:cp1251-*-仅由Python解释器用于转换ASCII范围之外的源Python文件中的字符。不管怎样,它只用于unicode,因为来自原始源的字节给出了。。。字节字符串中的字节完全相同。一些文本编辑器非常友好,可以自动使用这一行,但我对此不太自信,例如,当我使用gvim时,总是手动切换到正确的编码。短篇故事:-*-编码:cp1251-*-在您的代码中未使用,并且只会误导读者,因为它不是实际的编码

如果您想确定源代码中的内容,最好使用显式转义。在代码页1251中,这个单词由以下字符组成:'\xfe\xed\xe8\xea\xee\xe4'

如果您编写此源代码:

txt = '\xfe\xed\xe8\xea\xee\xe4'
print txt
print txt.decode('cp1251')
print unicode(txt, 'cp1251')
print unicode(txt, 'utf-8')
并在配置为使用CP1251字符集的控制台中执行,前三行将输出ююааа,最后一行将抛出UnicodeDecodeError异常,因为输入不再有效“utf8”

或者,如果您对当前的编辑器感到满意,您可以编写:

# -*- coding: utf8 -*-

txt = 'юникод'.decode('utf8').encode('cp1251') # or simply txt = u'юникод'.encode('cp1251')
print txt
print txt.decode('cp1251')
print unicode(txt, 'cp1251')
print unicode(txt, 'utf-8')
这应该会得到相同的结果——但是现在声明的源代码应该是python源代码的实际编码

顺便说一句,本机使用unicode的Python 3.5 IDLE确认:

>>> 'СЋРЅРёРєРѕРґ'.encode('cp1251').decode('utf8')
'юникод'

只需使用以下代码,但请确保以声明的编码保存源代码。它可以是支持要打印的字符的任何编码。终端可以采用不同的编码,只要它还支持要打印的字符:

#coding:utf8
print u'юникод'
优点是您不需要知道终端的编码。Python通常会1检测终端编码并正确编码打印输出


1除非您的终端配置错误。

只需使用以下代码,但请确保以声明的编码保存源代码。它可以是支持要打印的字符的任何编码。终端可以采用不同的编码,只要它还支持要打印的字符:

#coding:utf8
print u'юникод'
优点是您不需要知道终端的编码。Python通常会1检测终端编码并正确编码打印输出


1除非您的终端配置错误。

您的问题是编码声明错误:编辑器使用utf-8字符编码来保存源代码。使用-*-编码:utf-8-*-修复它

不要使用bytestrings文本创建字节对象 Python 2上的t表示文本;请改用Unicode字符串u文本-Unicode类型。 如果代码使用Unicode字符串,则Windows控制台使用的代码页并不重要,只要所选字体可以显示相应的非BMP字符。看

以下是完整的代码,供参考:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
print(u'юникод')
注:否。解码,unicode。如果您使用文字来创建字符串;如果字符串包含文本,则应使用Unicode文本。这是Python3上唯一一个不能将非ascii字符放在字节文本中的选项,在Python2上使用Unicode而不是ByTestRing作为文本也是一个很好的做法


如果某个API将bytestring作为输入而不是文本,则其编码与编码声明无关。使用何种特定编码取决于数据源。

您的问题在于编码声明错误:编辑器使用utf-8字符编码来保存源代码。使用-*-编码:utf-8-*-修复它

不要在Python2上使用bytestrings文本创建字节对象来表示文本;请改用Unicode字符串u文本-Unicode类型。 如果代码使用Unicode字符串,则Windows控制台使用的代码页并不重要,只要所选字体可以显示相应的非BMP字符。看

以下是完整的代码,供参考:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
print(u'юникод')
注:否。解码,unicode。如果您使用文字来创建字符串;如果字符串包含文本,则应使用Unicode文本。这是Python3上唯一一个不能将非ascii字符放在字节文本中的选项,在Python2上使用Unicode而不是ByTestRing作为文本也是一个很好的做法


如果某个API将bytestring作为输入而不是文本,则其编码与编码声明无关。具体使用何种编码取决于数据的来源。

您能突出显示您希望它看起来是什么样子吗?我希望打印unicode“юааа”和cp1251在我的终端中是юаааааааааа而不是垃圾符号。您能突出显示您希望它看起来是什么样子吗?我希望打印unicode“юа,在我的终端中,“cp1251”将是юаааааа而不是垃圾符号。我无法准确执行此代码,因为我的系统使用CP1252,所以我使用“аа”而不是“юаааааа1072!你完全正确。这真的很痛苦:D@xi_:这个问题比这个答案所暗示的要简单。您键入了“юааа”,编辑器保存了这些字节“\xd1\x8e\xd0\xbd\xb8\xd0\xba\xd0\xbe\xd0\xb4”以utf-8格式,python使用您明确指定的cp1251编码顺从地解码这些字节,并正确地打印出错误的Unicode字符串。注意:您的编辑器忽略了编码声明CONDING:cp1251,它没有在您的代码中使用。它用于Unicode文本:u'1102;юааа-只有在编码声明正确的情况下才有效-如果磁盘上的字节使用与声明相同的编码。@SergeBallesta:@J.F.Sebastian:谢谢您的参考,我不知道这个模块。但OP的问题只是声明的-*-编码和实数编码之间缺乏一致性,而不是显示任何内容的问题。我无法准确地执行此代码,因为我的系统使用CP1252,所以我使用“è”而不是“юèèèèèèè”,使用1252而不是1251……很好!你完全正确。这真的很痛苦:D@xi_:这个问题比这个答案所暗示的要简单。您键入了“юааа”,编辑器保存了这些字节“\xd1\x8e\xd0\xbd\xb8\xd0\xba\xd0\xbe\xd0\xb4”以utf-8格式,python使用您明确指定的cp1251编码顺从地解码这些字节,并正确地打印出错误的Unicode字符串。注意:您的编辑器忽略了编码声明CONDING:cp1251,它没有在您的代码中使用。它用于Unicode文本:u'1102;юааа-只有在编码声明正确的情况下才有效-如果磁盘上的字节使用与声明相同的编码。@SergeBallesta:@J.F.Sebastian:谢谢您的参考,我不知道这个模块。但是OP的问题只是声明的-*-编码和实际编码之间缺乏一致性,而不是显示任何内容的问题。