LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3264|回复: 2

python中文字符串处理问题

[复制链接]
发表于 2006-6-11 00:58:08 | 显示全部楼层 |阅读模式
我在一个python程序中要从一个中英文混合的文件中查找有没有用户输入的一个字符串。文件用Unicode存,程序中用Unicode字符串做,在Linux下使用没有问题(配置合适的话小企鹅和cce都可以输入UTF8汉字),但在Windows(中文版及英文版)下测试,输入法输入的都是GB编码汉字,无法与Unicode字符串进行匹配操作。

如果我把原文件也用GB存,又会出现两个半字符结合错误匹配的问题,比如原文中有“人民”,没有“嗣”,因为“人民”GB是“\xc8\xcb\xc3\xf1”,“嗣”GB是“\xcb\xc3”,搜索“嗣”就会认为找到了。这样也不妥。

微软的东西这方面做得比较智能,.NET下默认也是Unicode编码,但输入或复制粘贴GB编码的文字过去都能正确处理。

那么如何在python下解决这个问题呢?谢谢。
发表于 2006-6-11 04:34:40 | 显示全部楼层
那文件就用unicode保存,然后把输入的字符用unicode函数转换GB编码!
反过来也可以!
回复 支持 反对

使用道具 举报

发表于 2006-7-18 20:41:36 | 显示全部楼层
正确地说楼主除了得手工检查内码之外基本上也没有别的办法了。

按我个人的习惯,如果一个project必须在两个平台上开发,我会要求我的程序使用同样的encoding,比如要求所有的文件都使用UTF-8,如果实在不能统一(一般是为了满足许多所谓专家学者莫名其妙的要求),可以退而求其次,用当前系统编码决定文件内文的编码:

import locale
import string
import re

#根据当前系统的encoding构造需要的编码取值
lang = string.upper(locale.setlocale(locale.LC_ALL, ""))
textencoding = None
#检查编码的值是不是满足我们需要的情况
if re.match("UTF-8", lang) != None:
    # UTF-8编码
   textencoding = "utf-8"
elif re.match(r"CHINESE|CP936", lang):
    # Windows下的GB编码
   textencoding = "gb18030"
elif re.match(r"GB2312|GBK|GB18030", lang):
    # Linux下的GB编码
   textencoding = "gb18030"
else:
    # 其他情况,抛个错误吧
   raise UnicodeError

fd = file(filename, "r")
fulltextlist = fd.readlines()
# 把每一行转换成unicode
for each in len(fulltextlist):
    fulltextlist = unicode(each, textencoding)
fd.close()
# 如果要打印的话,可以用 text.encode(encoding) 来恢复成多字节编码。


注意,这里的code效率很低的,楼主要是打算搬过来用的话,记得优化一下。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表