unicode中文 数字 英文 半角和全角判断
unicode 字符展示:http://www.52unicode.com/
在线转换网站:https://www.matools.com/code-convert-unicode
下面这个小工具包含了判断unicode是否是汉字、数字、英文或者其他字符,全角符号转半角符号,unicode字符串归一化等工作。
#!/usr/bin/env Python
-- coding:GBK --
“”"汉字处理的工具:
判断unicode是否是汉字,数字,英文,或者其他字符。
全角符号转半角符号。"""
author="internetsweeper < anonymous > "
date=“2007-08-04”
def is_chinese(uchar):
"""判断一个unicode是否是汉字"""if uchar >= u'\u4e00' and uchar<=u'\u9fa5':return Trueelse:return False
def is_number(uchar):
"""判断一个unicode是否是数字"""if uchar >= u'\u0030' and uchar<=u'\u0039':return Trueelse:return False
def is_alphabet(uchar):
"""判断一个unicode是否是英文字母"""if (uchar >= u'\u0041' and uchar<=u'\u005a') or (uchar >= u'\u0061' and uchar<=u'\u007a'):return Trueelse:return False
def is_other(uchar):
"""判断是否非汉字,数字和英文字符"""if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):return Trueelse:return False
def B2Q(uchar):
"""半角转全角"""inside_code=ord(uchar)if inside_code<0x0020 or inside_code>0x7e: #不是半角字符就返回原来的字符return ucharif inside_code==0x0020: #除了空格其他的全角半角的公式为:半角=全角-0xfee0inside_code=0x3000else:inside_code+=0xfee0return unichr(inside_code)
def Q2B(uchar):
"""全角转半角"""inside_code=ord(uchar)if inside_code==0x3000:inside_code=0x0020else:inside_code-=0xfee0if inside_code<0x0020 or inside_code>0x7e: #转完之后不是半角字符返回原来的字符return ucharreturn 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:continueelse: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 B2Qfor i in range(0x0020,0x007F):print Q2B(B2Q(unichr(i))),B2Q(unichr(i))#test uniformustring=u'中国 人名a高频A'ustring=uniform(ustring)ret=string2List(ustring)print ret
以上转自http://hi.baidu.com/fenghua1893/item/d1a71d5ac47ffdcfd3e10cd1
这个问题是做 MkIV 预处理程序时搞定的,就是把一个混合了中英文混合字串分离为英文与中文的子字串,譬如,将 ”我的 English 学的不好“ 分离为 “我的"、" English ” 与 “学的不好” 三个子字串。
- 中英文混合字串的统一编码表示中英文混合字串处理最省力的办法就是把它们的编码都转成 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。
中英文混合字串的分离一旦中英文字串的编码获得统一,那么对它们进行分裂就是很简单的事情了。首先要为中文字串与英文字串分别准备一个收集器,使用两个空的字串对象即可,譬如 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 = Falsefor c in zh_en_str:if not zh_status and is_zh (c):zh_status = Trueif en_gather != "":zh_en_group.append ([mark["en"],en_gather])en_gather = ""elif not is_zh (c) and zh_status:zh_status = Falseif zh_gather != "":zh_en_group.append ([mark["zh"], zh_gather])if zh_status:zh_gather += celse: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 ©:
x = ord ©
# Punct & Radicals
if x >= 0x2e80 and x <= 0x33ff:
return True
# Fullwidth Latin Characterselif x >= 0xff00 and x <= 0xffef:return True# CJK Unified Ideographs &# CJK Unified Ideographs Extension Aelif x >= 0x4e00 and x <= 0x9fbb:return True# CJK Compatibility Ideographselif x >= 0xf900 and x <= 0xfad9:return True# CJK Unified Ideographs Extension Belif x >= 0x20000 and x <= 0x2a6d6:return True# CJK Compatibility Supplementelif x >= 0x2f800 and x <= 0x2fa1d:return Trueelse: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
unicode中文 数字 英文 半角和全角判断相关推荐
- 英文半角及全角的区别如何转换
英文半角占一个字节,也就是1byte,用的是ASCII中的字符. 英文全角占两个字节,也就是2byte,用的是GB2312-80. 看起来就是这样的: 半角:a,b.c;d 全角:a,b.c:d 因此 ...
- 字母和数字半角和全角的问题
有的时候,我们没有限制用户输入的字母数字是半角或者全角. 但是默认一般各个系统在证件号码方面全部都是半角的(数字和字母,是AS编码,占一个字节).所以当用户输入全角的字母和数字的时候,我们需要处理一下 ...
- python 识别汉字、数字、字母,实现半角及全角之间的转换
去除标点符号: re.sub text = "电影<2012>讲述了2012年12月21日的世界末日,主人公Jack以及世界各国人民挣扎求生的经历,灾难面前,尽现人间百态.&qu ...
- python中英文半角还是全角_如何理解python3的unicode,以及全角半角转换
匿名用户 1级 2017-11-06 回答 1. unicode是一个编码的standard,表明了字符与数字之间的映射,是可变长的. 2. 映射后的数据如何编码为字节?这个就是具体的编码规则:目前最 ...
- java全角数字_JAVA技巧(JAVA全角和半角的转换代码)
实现代码如下: public class change { public static void main(String[] args) { String QJstr="全角转半角DAO&q ...
- java中文半角转全角_java对于半角和全角的转换
本文章转载自:http://www.blogjava.net/action/archive/2006/06/01/49743.html 非常感谢上面链接的文章,在我项目中帮助了我. 方法一: // 半 ...
- 半角与全角、简繁体中文字符串互相转化
imports Microsoft.VisualBasic dim s as string= "苹果软件工作室" s = Strings.StrConv(s, VbStrConv. ...
- python中英文半角还是全角_Python3全角转半角的方法
相信大家都对全角半角的概念已经有所了解了.中文文字永远是全角,只有英文字母.数字键.符号键才有全角半角的概念,一个字母或数字占一个汉字的位置叫全角,占半个汉字的位置叫半角.标点符号在中英文状态下.全半 ...
- 半角和全角的区别 java_输入法全角和半角的区别是什么?【详解】
导语:今天为大家介绍的是全角和半角的区别,还有就是全角和半角的切换方法.可能有的人还是第一次听到全角和半角,小编先来解释一下,我们在使用中文输入法打字的时候,在右下角的输入法表面有一个月牙形状的符号, ...
最新文章
- 禁用/启用按钮和链接的最简单方法是什么(jQuery + Bootstrap)
- mysql 加密方式 caching_sha2_password 和 mysql_native_password 说明
- Android Binder设计与实现 - 实现篇(1)
- 资料分享 | R语言资料分享来袭
- SqlServer 时间格式化
- Oulipo (KMP出现次数)
- 砍掉中国90%的科研人员,对科技发展的影响微乎其微,某教授酒后真言!
- 学习《让UpdatePanel支持文件上传》系列文章的相关链接
- 10通信端口感叹号_开源企业级微信小程序实时通信聊天室技术架构演练
- 推荐给每个找工作的IT毕业生--打鸡血书
- 四种常见演讲结构对比
- C#操作Word(二)——将Word文档嵌入到WinForm窗体中
- UDS服务中关于服务器响应行为的实现规则
- 2021年中国高空作业平台行业发展现状及竞争格局分析,国产品牌异军突起「图」
- 使用calibre给电子书生成目录
- 腾讯游戏运营总监酒后吹批:运维工程师这些知识点都不会?赶紧找个地埋了吧!
- 公钥密码学中的三大难解数学问题
- Oracle 11G启动自动内存管理AMM
- Android AudioFocus机制小结
- 假设银行一年整存零取的月息为1.875%(年息为12*1.875%,年息按复利计算),现在某人手头有一笔钱,他打算在今后5年中,每年年底取出1000元作为孩子来年的教育金,到第5年孩子毕业时刚好取完这