小编码大阻力

本文主要讨论在处理汉字时遇到的编码问题,包括如何从文件中匹配汉字及其对应的数字,解决汉字提取和数据传输过程中的编码错误,以及如何确保在json序列化时保持汉字的正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、匹配汉字

实现一个从档案中提出指定中文后对应数字的小程序,如:

很多很多的信息····

张三:18 张三其它的信息·····

很多很多的信息····


思路:

1.不能确定每个文件中都有张三这个人,所以要先判断一下张三在不在。

2.用张三把他前后的文字分隔开,再从后面的文字中挑选需要的。


一直提示错误,说是编码不对。


更正点:

1.我习惯这样来表达:u”张三“,这是把它转换成unicode,和文件中的原有编码是不一致的。所以此时应直接用“张三”。

name1 = "张三"
name2 = u"张三"
text = "我是张三"
name1 in text
True
name2 in text
False
2.注意文件的原有编码是什么,我这次收到的文件是gbk的,而之前一直都是utf-8,所以就遗漏了这个问题。因为需要批量处理文件,而文件名又是时间,于是用了一个偷懒的方法去实现转码问题。

for i in *.txt;do iconv -f gbk -t utf-8 $i>>$i;done

因为原有的gbk部分程序识别不到,所以直接加进去是不会有影响的,但是这样会把原文件更改掉。

改进法:

for i in *.txt;do iconv -f gbk -t utf-8 $i>>新建文件夹/$i;done

如果只想转文件名

默认是不改变文件,要加上notest才能生效

yum -y install convmv 
convmv -f GBK -t UTF-8  -r *
convmv -f GBK -t UTF-8  --notest -r *


二、在汉字中提取单个或多个汉字

读取文件中某个固定位置的中文,如每行的最后一个文字,但是一直匹配不出来,解决方法如下:

在utf-8的编码下,一个非unicode的中文占3个字符,即Chinese_character = line[-3:]


三、数据传输

一直乱码,就是被json弄到ascii了,要这样写

json.dumps(response, ensure_ascii=False)


四、查看字符串类型

import sys
print sys.getdefaultencoding()
print isinstance(你的那个数, unicode)


在文件开头加上
reload(sys)
sys.setdefaultencoding(‘utf8′)这2行,再试着运行一下
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。 
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
代码中字符串的默认编码与代码文件本身的编码一致。 
如:s='中文'
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。 
如果字符串是这样定义:s=u'中文'
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
isinstance(s,unicode)  #用来判断是否为unicode 
用非unicode编码形式的str来encode会报错 

 如何获得系统的默认编码? 
#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()  
该段程序在英文WindowsXP上输出为:ascii 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值