我很困惑。我需要帮助!!!
我正在处理一个包含中文字符的文件,例如,我们称之为a.TEST
,这就是里面的内容。
你好 中国 Hello China 1 2 3
你不需要了解中文的意思。(其实这是'你好中国')
>>> f=open('wr.TRAIN')
>>> print f.read()
你好 中国 Hello China 1 2 3
>>> f.seek(0)
>>> content = f.readline()
>>> content
'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
>>> print content
你好 中国 Hello China 1 2 3
>>> type(content)
<type 'str'>
>>> isinstance(content,unicode)
False
第一个问题:为什么当我只输入utf-8
时,python shell会给content
content
,同时print content
cmd可以输出我想看的表格吗?
第二个问题:unicode
和str
之间有什么区别?
有人告诉我,encode
已转换为unicode
到str
,但我从Unicode HowTo学到的东西告诉我encode
是unicode
转换为{{} 1}}
尚未结束! :)
这里是utf-8
test.py
第三个问题:当我#!/usr/bin/python
#-*- coding: utf-8 -*-
fr = open('a.TEST')
fw = open('out.TEST','w')
content = fr.readline()
content_list = content.split()
print content
fw.write('{0}'.format(content_list))
fr.close()
fw.close()
时,为什么汉字会变成utf-8代码?
我认为.split()
会起作用,但事实并非如此。
我不希望写入fw.write('{0}'.format(content_list).decode('utf-8'))
的是字符编码形式,我希望它完全是原来的字符(你好)。怎么做?
答案 0 :(得分:6)
文件由字节组成。您可以使用0到255之间的数字表示每个字节(或以十六进制表示0x00和0xFF)。
文本也写为字节。关于文本编写方式的协议。那是一种编码。最基本的编码是ASCII,其他编码通常基于它。例如,ASCII定义数字65(0x41)代表&#39; A&#39; 66(0x42)代表&#39; B&#39;等
在python中,您可以使用数值定义字符串:
>>> '\x41\x42\x43'
'ABC'
'\x41\x42\x43'
与'ABC'
完全相同。 Python将始终使用更易读的文本表示形式表示字符串('ABC'
)。
但是,某些数值不是可打印字符,因此它们将以数字形式表示:
>>> '\x00\x01\x02\x03\x04'
'\x00\x01\x02\x03\x04'
其他角色有别名,可以让您的工作更轻松:
>>> '\x0a\x0d\x09'
'\n\r\t'
ASCII table定义数字0-127的含义,仅包括英文字母。数字128-255未定义。因此,其他编码定义了128-255的含义。还有一些人改变了整个范围的含义0-255。
有许多编码,他们以不同的方式定义128-255。
例如,在windows-1250编码中,字符185(0xB9)为ą
,但在iso-8859-2编码中为š
。
那么,如果你打印\xb9
会怎样?这取决于控制台中使用的编码。在我的情况下(我的控制台使用cp852编码)它是:
>>> print '\xb9'
╣
由于这种歧义,字符串'\xb9'
永远不会被表示为 '╣'
(也不是'ą'
...)。那会隐藏真正的价值。它将表示为数值:
>>> '\xb9'
'\xb9'
此外:
>>> '╣'
'\xb9'
另请参阅我的控制台中问题的字符串:
>>> content = '\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
>>>
>>> content
'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
>>>
>>> print content
ńŻáňąŻ ńŞşňŤŻ Hello China 1 2 3
但是如果刚刚在控制台中输入变量会发生什么?
如果变量是没有print
的cosole中的enteren,则会打印其表示形式。它与以下内容相同:
>>> print repr(content)
'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
Unicode table旨在定义世界上所有角色的数字表示形式。它实际上可以这样做,因为它不限于256个值(或实际上任何其他限制)。这不是编码,而是数字到字符的通用映射。
例如,unicode定义数字353(0x0161)是字符š
。无论您使用何种语言环境和编码,这都是正确的。该字符可以任何支持š
的编码存储在文件(或内存)中。
编码unicode字符时,可以使用任何编码,但并非所有编码都支持所有字符。
例如,š
(unicode 0x0161)可以在iso-8869-2中编码为0xB9,但它根本不能在iso-8869-1中编码。
因此,为了能够编码任何东西,您需要一个支持每个 unicode字符的编码。 UTF-8是其中一种编码,但还有其他编码:
>>> u'\u0161'.encode('utf-7')
'+AWE-'
>>> u'\u0161'.encode('utf-8')
'\xc5\xa1'
>>> u'\u0161'.encode('utf-16le')
'a\x01'
>>> u'\u0161'.encode('utf-16be')
'\x01a'
>>> u'\u0161'.encode('utf-32le')
'a\x01\x00\x00'
>>> u'\u0161'.encode('utf-32be')
'\x00\x00\x01a'
utf-8的优点是整个ASCII范围不变,只要使用ASCII,每个字符只使用一个字节:
>>> u'abcdefg'.encode('utf-8')
'abcdefg'
<2> Python 2中的Unicode
重要:这非常适合Python 2. Python 3不同。
与str
个对象(字节串)不同,unicode
个对象是unicode字符串。
可以使用所选编码将str
编码为str
,或以所选编码从u
进行解码。
在开头报价之前使用\uHEX
指定unicode字符串。内部字符使用当前编码进行解释,或者可以使用数字格式>>> u'ABCD'
u'ABCD'
>>>
>>> u'\u0041\u0042\u0043'
u'ABC'
>>> u'šâů'
u'\u0161\xe2\u016f'
:
contents
repr(contents)
打印print contents
contents
打印str
UTF-8 字符串是字节字符串(unicode
)。您可以通过编码>>> u'\u0161'.encode('utf-8')
'\xc5\xa1'
>>> '\xc5\xa1'.decode('utf-8')
u'\u0161'
:
encode
是的,unicode
将str
转换为str
。 content_list
可以是utf-8,但不一定是。
A) &#34;为什么中文字符在我执行.split()时会变成utf-8代码?&#34;
他们一直都是utf-8。
B) &#34;我认为fw.write(&#39; {0}&#39; .format(content_list).decode(&#39; utf- 8&#39;))将工作&#34;
repr
不是字符串。这是一个清单。当列表转换为字符串时,它会使用repr
来完成,>>> 'a \n a \n a'
'a \n a \n a'
>>> print 'a \n a \n a'
a
a
a
>>> print ['a \n a \n a']
['a \n a \n a']
也会完成所有内容的{{1}}。
例如:
{{1}}
最后一个打印的repr(list),其中包含repr(str)。
答案 1 :(得分:1)
一开始,只有英文字符,人们不满意。
然后他们想要展示世界上的每一个角色。但是有问题。一个字节只能代表255个字符。只是没有足够的地方来容纳它们。
然后人们决定用两个字节代表一个字符。并称之为“utf8&#39;。
无论你写什么字符,它都以字节形式存储。
在Python中,没有这样的数据类型称为&#39; unicode&#39;,只是&#39; str&#39;。并且&#39; unicode&#39;是一个&#39; str的编码系统。
&#39; \ xe4 \ xbd \ xa0 \ xe5 \ xa5 \ xbd \ xe4 \ xb8 \ xad \ xe5 \ x9b \ xbd&#39;是&#34;你好中国&#34;的字节形式。 没有指定编码系统就无法显示。
我想你可以责怪linux / unix。 Python没有问题显示&#39; utf-8&#39;人物,而“猫”#39;不能。