添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

python 2.7 处理中文字符串时,经常会碰到乱码问题。最近在用python 2.7分割中文字符串,分割后的结果都是乱码。苦恼很久,终于找到原因。先看代码:

import os
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
str="我是小天才"
print(type(str))
strarr=[]
for i in str:
    print[i]
    strarr.append(i)
print("======================================")
print(strarr)

结果如下:

<type 'str'>
['\xe6']
['\x88']
['\x91']
['\xe6']
['\x98']
['\xaf']
['\xe5']
['\xb0']
['\x8f']
['\xe5']
['\xa4']
['\xa9']
['\xe6']
['\x89']
['\x8d']
======================================
['\xe6', '\x88', '\x91', '\xe6', '\x98', '\xaf', '\xe5', '\xb0', '\x8f', '\xe5', '\xa4', '\xa9', '\xe6', '\x89', '\x8d']

之所以会这样是因为在utf8编码形式为二进制,一个字由3个编码构成,python分割额时候,是按这个编码分割的。为了理解这个,请看下面代码:

print(str[:3])

这里可以看出,当按照编码规则,一次取3个编码的时候,打印中文就正常了。
但我们写代码的时候,如果碰到要分割中文字符串的时候,就每3个分割,这样显然反人类。

解决办法,将中文转unicode,在分割:

str="我是小天才"
str=unicode(str)
print(type(str))
print(str[:3])
strarr=[]
for i in str:
    print [i]
    strarr.append(i)
print("======================================")
print(strarr)
print(strarr[0])

结果如下:

<type 'unicode'>
[u'\u6211']
[u'\u662f']
[u'\u5c0f']
[u'\u5929']
[u'\u624d']
======================================
[u'\u6211', u'\u662f', u'\u5c0f', u'\u5929', u'\u624d']

我们可以看到,在unicode编码的情况下,每个中文对应一个编码,在按照编码分割的时候,分割出的结果就不会有错了。我们再进行打印,就可以显示中文了(前提:头部设置# -- coding: utf-8 --)。

在分割中文字符转时:先将str转unicode,再进行分割。

python 2.7 处理中文字符串时,经常会碰到乱码问题。最近在用python 2.7分割中文字符串,分割后的结果都是乱码。苦恼很久,终于找到原因。先看代码:import osimport sysreload(sys)sys.setdefaultencoding("utf-8")str="我是小天才"print(type(str))strarr=[]for i in str:...
利用find()函数找到要切割字的位置(index),如果切割字是中文,并不能直接(index + 1),而是要(index + len(带切割字符)) eg . s = "商务人生如影随形 ThinkPadT440亚马逊促—万维家电网" index = s.find("—") a = s[index + len("—") :] 如果直接a = s[index + 1:],输出a
python对于string的截取是 str[start,end] 但是中文字符却显示码,让人莫名奇妙的。这个坑琢磨了半天,解决办法是改为unicode格式。 unicode格式与str格式的转换关系参考 问题引申 python 中string和unicode 一 string类型的字符串拼接 先查看英文,可以看到他们截取是正确的。
这个牵扯到文件编码问题,不同格式的文件最前边有一个BOM来说明这个文件的编码格式,这个BOM是看不见的。比如我们写一个unicode格式文件,然后将其保存成utf-8格式,此在程序中读入该文件对其进行split()分割第一个字符就会出现\ufeff码! 解决方法:把我们读文件指定的utf-8改成utf-8-sig即可。sig为signature的意思,这样就会去掉文件头中的BOM。