python利用utf-8编码判断中文英文字符(转)

简介:

下面这个小工具包含了判断unicode是否是汉字、数字、英文或者其他字符,全角符号转半角符号,unicode字符串归一化等工作。

 

#!/usr/bin/env python

# -*- coding:GBK -*- 

 

"""汉字处理的工具:

判断unicode是否是汉字,数字,英文,或者其他字符。

全角符号转半角符号。"""

 

__author__="internetsweeper <zhengbin0713@gmail.com>"

__date__="2007-08-04"

 

def is_chinese(uchar):

        """判断一个unicode是否是汉字"""

        if uchar >= u'\u4e00' and uchar<=u'\u9fa5':

                return True

        else:

                return False

 

def is_number(uchar):

        """判断一个unicode是否是数字"""

        if uchar >= u'\u0030' and uchar<=u'\u0039':

                return True

        else:

                return False

 

def is_alphabet(uchar):

        """判断一个unicode是否是英文字母"""

        if (uchar >= u'\u0041' and uchar<=u'\u005a') or (uchar >= u'\u0061' and uchar<=u'\u007a'):

                return True

        else:

                return False

 

def is_other(uchar):

        """判断是否非汉字,数字和英文字符"""

        if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):

                return True

        else:

                return False

 

def B2Q(uchar):

        """半角转全角"""

        inside_code=ord(uchar)

        if inside_code<0x0020 or inside_code>0x7e:      #不是半角字符就返回原来的字符

                return uchar

        if inside_code==0x0020: #除了空格其他的全角半角的公式为:半角=全角-0xfee0

                inside_code=0x3000

        else:

                inside_code+=0xfee0

        return unichr(inside_code)

 

def Q2B(uchar):

        """全角转半角"""

        inside_code=ord(uchar)

        if inside_code==0x3000:

                inside_code=0x0020

        else:

                inside_code-=0xfee0

        if inside_code<0x0020 or inside_code>0x7e:      #转完之后不是半角字符返回原来的字符

                return uchar

        return unichr(inside_code)

 

def stringQ2B(ustring):

        """把字符串全角转半角"""

        return "".join([Q2B(uchar) for uchar in ustring])

 

def uniform(ustring):

        """格式化字符串,完成全角转半角,大写转小写的工作"""

        return stringQ2B(ustring).lower()

 

def string2List(ustring):

        """将ustring按照中文,字母,数字分开"""

        retList=[]

        utmp=[]

        for uchar in ustring:

                if is_other(uchar):

                        if len(utmp)==0:

                                continue

                        else:

                                retList.append("".join(utmp))

                                utmp=[]

                else:

                        utmp.append(uchar)

        if len(utmp)!=0:

                retList.append("".join(utmp))

        return retList

 

if __name__=="__main__":

        #test Q2B and B2Q

        for i in range(0x0020,0x007F):

                print Q2B(B2Q(unichr(i))),B2Q(unichr(i))

 

        #test uniform

        ustring=u'中国 人名a高频A'

        ustring=uniform(ustring)

        ret=string2List(ustring)

        print ret

 

以上转自http://hi.baidu.com/fenghua1893/item/d1a71d5ac47ffdcfd3e10cd1

 

 

这个问题是做 MkIV 预处理程序时搞定的,就是把一个混合了中英文混合字串分离为英文与中文的子字串,譬如,将 ”我的 English 学的不好“ 分离为 “我的"、" English ” 与 "学的不好" 三个子字串。

1. 中英文混合字串的统一编码表示中英文混合字串处理最省力的办法就是把它们的编码都转成 Unicode,让一个汉字与一个英文字母的内存位宽都是相等的。这个工作用 Python 来做,比较合适,因为 Python 内码采用的是 Unicode,并且为了支持 Unicode 字串的操作,Python 做了一个 Unicode 内建模块,把 string 对象的全部方法重新实现了一遍,另外提供了 Codecs 对象,解决各种编码类型的字符串解码与编码问题。
譬如下面的 Python 代码,可实现 UTF-8 编码的中英文混合字串向 Unicode 编码的转换:# -*-

 coding:utf-8 -*-
a = "我的 English 学的不好"
print type(a),len (a), a
b = unicode (a, "utf-8")
print type(b), len (b), b字符串 a 是 utf-8 编码,使用 python 的内建对象 unicode 可将其转换为 Unicode 编码的字符串 b。上述代码执行后的输出结果如下所示,比较字串 a 与字串 b 的长度,显然 len (b) 的输出结果是合理的。<type 'str'> 27 我的 English 学的不好
<type 'unicode'> 15 我的 English 学的不好要注意的一个问题是 Unicode 虽然号称是“统一码”,不过也是存在着两种形式,即:
UCS-2:为 16 位码,具有 2^16 = 65536 个码位; UCS-4:为 32 位码,目前的规定是其首字节的首位为 0,因此具有 2^31 = 2147483648 个码位,不过现在的只使用了 0x00000000 - 0x0010FFFF 之间的码位,共 1114112 个。 
使用Python  sys 模块提供的一个变量 maxunicode 的值可以判断当前 Python 所使用的 Unicode 类型是 UCS-2 的还是 UCS-4 的。import sys
print sys.maxunicode若 sys.maxunicode 的值为 1114111,即为 UCS-4;若为 65535,则为 UCS-2。

 

2. 中英文混合字串的分离一旦中英文字串的编码获得统一,那么对它们进行分裂就是很简单的事情了。首先要为中文字串与英文字串分别准备一个收集器,使用两个空的字串对象即可,譬如 zh_gather 与 en_gather;然后要准备一个列表对象,负责按分离次序存储 zh_gather 与 en_gather 的值。下面这个 Python 函数接受一个中英文混合的 Unicode 字串,并返回存储中英文子字串的列表。def split_zh_en (zh_en_str):

        zh_en_group = []
        zh_gather = ""
        en_gather = ""
        zh_status = False

        for c in zh_en_str:
                if not zh_status and is_zh (c):
                        zh_status = True
                        if en_gather != "":
                                zh_en_group.append ([mark["en"],en_gather])
                                en_gather = ""
                elif not is_zh (c) and zh_status:
                        zh_status = False
                        if zh_gather != "":
                                zh_en_group.append ([mark["zh"], zh_gather])
                if zh_status:
                        zh_gather += c
                else:
                        en_gather += c                               
                        zh_gather = ""

        if en_gather != "":
                zh_en_group.append ([mark["en"],en_gather])
        elif zh_gather != "":
                zh_en_group.append ([mark["zh"],zh_gather])

        return zh_en_group上述代码所实现的功能细节是:对中英文混合字串 zh_en_str 的遍历过程中进行逐字识别,若当前字符为中文,则将其添加到 zh_gather 中;若当前字符为英文,则将其添加到 en_gather 中。zh_status 表示中英文字符的切换状态,当 zh_status 的值发生突变时,就将所收集的中文子字串或英文子字串添加到 zh_en_group 中去。
判断字串 zh_en_str 中是否包含中文字符的条件语句中出现了一个 is_zh () 函数,它的实现如下:def is_zh (c):
        x = ord (c)
        # Punct & Radicals
        if x >= 0x2e80 and x <= 0x33ff:
                return True

        # Fullwidth Latin Characters
        elif x >= 0xff00 and x <= 0xffef:
                return True

        # CJK Unified Ideographs &
        # CJK Unified Ideographs Extension A
        elif x >= 0x4e00 and x <= 0x9fbb:
                return True
        # CJK Compatibility Ideographs
        elif x >= 0xf900 and x <= 0xfad9:
                return True

        # CJK Unified Ideographs Extension B
        elif x >= 0x20000 and x <= 0x2a6d6:
                return True

        # CJK Compatibility Supplement
        elif x >= 0x2f800 and x <= 0x2fa1d:
                return True

        else:
                return False这段代码来自 jjgod 写的 XeTeX 预处理程序。
对于分离出来的中文子字串与英文子字串,为了使用方便,在将它们存入 zh_en_group 列表时,我对它们分别做了标记,即 mark["zh"] 与 mark["en"]。mark 是一个 dict 对象,其定义如下:mark = {"en":1, "zh":2}如果要对 zh_en_group 中的英文字串或中文字串进行处理时,标记的意义在于快速判定字串是中文的,还是英文的,譬如:for str in zh_en_group:
        if str[0] = mark["en"]:
                do somthing
        else:
                do somthing 

本文转自博客园知识天地的博客,原文链接:python利用utf-8编码判断中文英文字符(转),如需转载请自行联系原博主。

相关文章
|
3月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
57 0
|
2月前
|
人工智能 Shell 开发工具
[oeasy]python0041_输出ASCII码表_英文字符编码_键盘字符_ISO_646
本文介绍了ASCII码表的生成与使用,包括英文字符、数字和符号的编码。通过Python代码遍历0到127的ASCII值,解决了找不到竖线符号的问题,并解释了ASCII码的固定映射关系及其重要性。文章还介绍了ASCII码的历史背景,以及它如何成为国际标准ISO 646。最后,通过安装`ascii`程序展示了完整的ASCII码表。
28 1
|
4月前
|
Python
python获取字符串()里面的字符
在Python中,如果你想获取字符串中括号(比如圆括号`()`、方括号`[]`或花括号`{}`)内的字符,你可以使用正则表达式(通过`re`模块)或者手动编写代码来遍历字符串并检查字符。 这里,我将给出使用正则表达式的一个例子,因为它提供了一种灵活且强大的方式来匹配复杂的字符串模式。 ### 使用正则表达式 正则表达式允许你指定一个模式,Python的`re`模块可以搜索字符串以查找匹配该模式的所有实例。 #### 示例:获取圆括号`()`内的内容 ```python import re def get_content_in_parentheses(s): # 使用正则表达
125 36
|
2月前
|
人工智能 开发工具 Python
[oeasy]python040_缩进几个字符好_输出所有键盘字符_循环遍历_indent
本文探讨了Python代码中的缩进问题。通过研究`range`函数和`for`循环,发现缩进对于代码块的执行至关重要。如果缩进不正确,程序会抛出`IndentationError`。文章还介绍了Python的PEP8规范,推荐使用4个空格进行缩进,并通过示例展示了如何使用Tab键实现标准缩进。最后,通过修改代码,输出了从0到122的字符及其对应的ASCII码值,但未能找到竖线符号(`|`)。文章在总结中提到,下次将继续探讨竖线符号的位置。
26 0
|
4月前
|
Python
python第三方库-字符串编码工具 chardet 的使用(python3经典编程案例)
这篇文章介绍了如何使用Python的第三方库chardet来检测字符串的编码类型,包括ASCII、GBK、UTF-8和日文编码的检测示例。
191 6
|
4月前
|
索引 Python
python之判断字符里面有没有|8
python之判断字符里面有没有|8
|
4月前
|
Python
Python 中如何指定 open 编码为ANSI
Python 中如何指定 open 编码为ANSI
78 1
|
4月前
|
Python
Python ASCII码与字符相互转换
Python ASCII码与字符相互转换
|
4月前
|
Python
[oeasy]python035_根据序号得到字符_chr函数_字符_character_
本文介绍了Python中的`ord()`和`chr()`函数。`ord()`函数通过字符找到对应的序号,而`chr()`函数则根据序号找到对应的字符。两者互为逆运算,可以相互转换。文章还探讨了单双引号在字符串中的作用,并解释了中文字符和emoji也有对应的序号。最后总结了`ord()`和`chr()`函数的特点,并提供了学习资源链接。
39 4
|
5月前
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
362 1
下一篇
开通oss服务