python 中文unicode编码

博客主要围绕Excel写入中文报错展开,介绍向Excel追加内容和新建Excel写入中文时出现UnicodeDecodeError的解决办法,还阐述了unicode与utf - 8编码,以及unicode与普通string字符串相互转换的方法,最后讲解了str.rsplit()函数的使用。
一、 excel中写入中文报错UnicodeDecodeError : ‘ascii’ codec can’t decode byte 0xe5 in position 0: ordinal not in range(128)
1.向excel中追加内容

解决方法:

  1. 第一行加入 # -*- coding: utf-8 -*-
  2. 将中文按“Unicode”字符编码方式进行写入。

代码如下:

# -*- coding: utf-8 -*-
import xlwt
name = u'小明'
excel = xlwt.Workbook()
sheet1 = excel.add_sheet(u'sheet1', cell_overwrite_ok=True)
sheet1.write(0, 0, u'你好')
sheet1.write(0, 1, u'hello, ' + name)
excel.save('save_filepath')

输出结果
插入工作表‘sheet1’:u'sheet1'
写入中文:u'你好'u'hello, ' + name

2.新建excel写入中文
# -*- coding: utf-8 -*-
from xlwt import Workbook

book =Workbook(encoding='utf-8')
sheet1 =book.add_sheet('list')

二、unicode 与utf-8编码

unicode->str :a.encode("utf-8")
str->unicode: unicode(b, "utf-8")b.decode("utf-8")

代码如下:

a = u'你好'
b = a.encode("utf-8")
c = unicode(b, "utf-8")
print a, type(a)
print b, type(b)
print c, type(c)
print c + u"hahaha", type(c + u"hahaha")

输出:
你好 <type ‘unicode’>
你好 <type ‘str’>
你好 <type ‘unicode’>
你好hahaha <type ‘unicode’>

s = u'\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8'
print s

输出:人生苦短,py是岸


三、unicode与普通string字符串相互转换

unicodestring = u"Hello world"

1.将Unicode转化为普通Python字符串:“encode” 编码
utf8string = unicodestring.encode("utf-8")  
asciistring = unicodestring.encode("ascii")  
2.将普通Python字符串转化为Unicode:“decode” 解码
plainstring1 = unicode(utf8string, "utf-8")  
plainstring2 = unicode(asciistring, "ascii")  

四、str.rsplit()

str.rsplit(’.’, num1)[num2],其中num1为要将str从后向前分为num1+1部分(列表形式),num2为取第num2+1部分。

a = '20181115 15:33:58:193804_保修卡CYWK-6016S(sharp)(英文)2360.pdf.pdf'
print a.rsplit('.', 3)[0]

输出:20181115 15:33:58:193804_保修卡CYWK-6016S(sharp)(英文)2360


<think>我们面对的问题:如何将Unicode编码(如\u6211\u7231\u4f60)转换为中文字符串(如"我爱你")根据提供的引用,我们可以总结以下几种方法:方法1:使用字符串的encode和decode方法配合'unicode_escape'编解码器(引用[1]和引用[2])步骤:1)将包含Unicode转义序列的字符串(例如r'\u6211\u7231\u4f60')通过encode方法编码为bytes(使用默认编码,通常是utf-8)2)然后使用'unicode_escape'解码为Unicode字符串,此时转义序列会被转换为实际的字符。方法2:直接使用字符串的decode方法(但注意在Python3中,字符串没有decode方法,因此这种方法在Python3中不适用,引用[4]可能是针对Python2的)在Python2中,我们可以这样:unicode_str.decode('unicode_escape')但是在Python3中,字符串都是Unicode字符串,所以我们需要先编码成bytes,再解码。方法3:使用内置函数eval(虽然不推荐,因为不安全,但有时也会被提到,注意:引用中没有提到,但我们知道有这种方法,但用户没有要求,且不安全,这里不采用)因此,我们重点推荐在Python3中安全且常用的方法。另外,注意引用[3]中的方法:先编码为utf-8,然后再解码。但注意,这种方法实际上并不处理转义序列,它只是改变编码格式。因此,我们观察引用[3]的例子,它实际上和我们的需求不同,因为它假设输入已经是Unicode字符串(即已经转义过的字符串,但在Python3中,如果字符串中就是中文字符,那么直接使用即可,不需要转换)。而我们的需求是:输入是一个包含Unicode转义序列(即反斜杠u加四个十六进制数字)的字符串。因此,我们需要区分两种情况:1.字符串本身已经是Unicode字符(比如在Python3中,字符串是'我爱你'),那么不需要转换。2.字符串是原始字符串,里面含有转义序列但没有被转义,如r'\u6211\u7231\u4f60'或普通字符串'\\u6211\\u7231\\u4f60'(注意,在普通字符串中,反斜杠需要转义,所以有两个反斜杠)。我们要转换的是第二种情况。下面给出两种在Python3中可用的方法:方法一(推荐):使用编解码器unicode_escape注意:当字符串中含有反斜杠u形式的转义序列时,我们可以将其编码为bytes,然后用'unicode_escape'解码。例如:s=r'\u6211\u7231\u4f60'#或者s='\\u6211\\u7231\\u4f60's_encoded=s.encode('utf-8')#或者直接用s.encode('unicode_escape')是不对的,因为这样会再次转义#实际上,我们只需要将原始字符串(也就是字节形式的字符串)按unicode_escape解码即可,所以:decoded_str=s.encode('utf-8').decode('unicode_escape')#但是注意,这里先编码成字节,再解码然而,有一个更直接的方法:我们可以直接使用字符串的encode方法得到字节,然后从字节用unicode_escape解码成字符串:decoded_str=s.encode().decode('unicode_escape')或者更明确地指定编码(虽然utf-8是默认的):decoded_str=s.encode('utf-8').decode('unicode_escape')但是,注意:如果原始字符串中的反斜杠已经被转义(即有两个反斜杠),那么这样处理是可以的。但如果是原始字符串(r'...'),同样可以。方法二(使用codecs模块):importcodecss=r'\u6211\u7231\u4f60'decoded_str=codecs.decode(s,'unicode_escape')注意:引用中没有提到这种方法,但也是可行的。然而,根据引用[1]和引用[2]的示例,我们采用第一种方法。但是,需要特别注意的是,如果原始字符串中包含有混合的中文字符(已经是中文字符)和Unicode转义序列,那么这种方法会破坏原有的中文字符吗?实际上,在Python3中,如果字符串中已经有中文字符,那就意味着这个字符串已经是Unicode字符串。而里面的转义序列是以反斜杠u开头的,所以会被一起转义。因此,我们建议输入字符串应该是纯转义序列的形式,否则可能会有问题。例如:s='你好\\u6211\\u7231\\u4f60'转换后:'你好我爱你'如果s是混合的,那么转换是安全的,因为非转义部分(比如'你好')在encode()时会被编码为字节,然后在decode('unicode_escape')时,非转义序列的字节会被原样转换为字符,所以不会变化。现在,我们给出一个完整的步骤示例:步骤1:输入一个字符串,其中包含Unicode转义序列(例如:s=r'\u6211\u7231\u4f60')步骤2:使用上述方法转换步骤3:输出转换后的字符串代码示例:s=r'\u6211\u7231\u4f60'#或者s='\\u6211\\u7231\\u4f60'converted_str=s.encode('utf-8').decode('unicode_escape')print(converted_str)#输出:我爱你另外,如果我们的字符串是从文件或网络中读取的,那么它可能已经是这种包含转义序列的字符串,处理方法相同。下面我们将编写一个函数来实现这个转换,并包含文档字符串。注意:有些情况下,字符串中可能混合有Unicode转义序列和其他反斜杠转义序列(如\n,\t等),那么decode('unicode_escape')也会将这些转义序列一起转义。如果不需要,则需谨慎。但在我们的需求中,只需要转换Unicode转义序列,而如果同时需要转换其他转义序列,那也没问题,因为都是合法的。如果只想转换Unicode转义序列而不影响其他转义序列,目前没有直接的方法,可能需要使用正则表达式替换,但通常情况下一并转换是可以接受的。因此,我们按通用方法实现。</think> 在Python中将Unicode编码(如 `\u6211\u7231\u4f60`)转换为中文字符串主要有以下几种可靠方法,下面详细介绍每种实现方式及注意事项: --- ### ✅ 方法一:使用 `unicode_escape` 编解码器(推荐) 这是Python原生支持的最简洁方法,适用于处理原始Unicode转义序列字符串: ```python # 包含Unicode转义序列的原始字符串 unicode_str = r'\u6211\u7231\u4f60' # 转换过程:字节编码Unicode转义解码 → 字符串 chinese_str = unicode_str.encode('utf-8').decode('unicode_escape') print(chinese_str) # 输出: 我爱你 ``` **原理说明**: 1. `.encode('utf-8')`:将字符串转换为UTF-8编码的字节序列 2. `.decode('unicode_escape')`:解析字节序列中的Unicode转义序列(如`\uXXXX`)[^1][^2] --- ### ✅ 方法二:处理混合编码字符串 当字符串中混有中文Unicode转义序列时(常见于API响应): ```python mixed_str = "欢迎使用\u7cfb\u7edf" # 包含中文Unicode转义 # 处理混合编码 chinese_str = mixed_str.encode('utf-8').decode('unicode_escape') print(chinese_str) # 输出: 欢迎使用系统 ``` --- ### ✅ 方法三:使用 `codecs` 模块(安全处理文件流) 适用于从文件/网络流读取Unicode数据: ```python import codecs # 模拟文件内容(含Unicode转义) file_content = r"姓名:\u738b\u5c0f\u660e \u5e74\u9f84:\u0033\u0030" # 直接解码字符串 decoded_str = codecs.decode(file_content, 'unicode_escape') print(decoded_str) # 输出: 姓名:王小明 年龄:30 ``` --- ### ⚠️ 重要注意事项 1. **Python 2 vs Python 3**: - Python 2需要显式声明Unicode:`u'\u4e2d'` - Python 3默认所有字符串为Unicode(无需u前缀) 2. **原始字符串标识**: - 使用 `r''` 防止转义字符被解析: ```python # 正确(保留转义符) raw_str = r'\u4e2d\u56fd' ``` 3. **安全警示**: - **避免使用 `eval()`**: 虽然 `eval(r"u'\u4e2d'")` 有效,但会执行任意代码(高危) --- ### ✏️ 应用场景示例 ```python # API响应处理案例 import requests response = requests.get('https://api.example.com/data') unicode_data = response.json()['content'] # 获取含Unicode转义的字符串 # 转换为中文 final_text = unicode_data.encode('utf-8').decode('unicode_escape') print(f"处理结果: {final_text}") ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值