相关文章推荐
仗义的红薯  ·  npm @types/node ...·  11 月前    · 

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

下面这个小工具包含了判断unicode是否是汉字、数字、英文或者其他字符,全角符号转半角符号,unicode字符串归一化等工作。 #!/usr/bin/env Python# -*- coding:GBK -*-  &quot;&quot;&quot;汉字处理的工具:判断unicode是否是汉字,数字,英文,或者其他字符。全角符号转半角符号。&quot;&quot;&quot; __author__=&quot;internet...
下面这个小工具包含了 判断 unicode 是否是 汉字 数字 英文 ,或者其他字符。 全角符号转半角符号。 unicode 字符串归一化等工作。 还有一个能处理多音字的 汉字 转拼音的程序,还在整理中。 #!/usr/bin/env python # -*- coding:GBK -*- """ 汉字 处理的工具: 判断 unicode 是否是 汉字 数字 英文 ,或者其他字...
1. 首先要考虑将String转成一个bytes的数组, 每个 汉字 是3个bytes, 英文 或者标点是1个byte. 2. 然后去 判断 一下每一个byte的前面几个bit, 看下面的表, 1个byte的字符, 就是 英文 跟标点, 它的第1个bit是0; 3. 重点是3个bytes的字符, 就是 汉字 , 或者说CJK, 它的第1个byte的前面4个bit, 是1110, 那么我们可以根据这...
在MATLAB中 判断 字符串是不是中文涉及到字符 编码 问题,通常采用 Unicode 编码 Unicode 是一种国际 编码 标准,能够表示世界上所有的符号、文字、语言和符号系统。在 Unicode 编码 中,中文字符的 编码 范围是0x4E00-0x9FA5。 因此,可以通过MATLAB内置函数 unicode 2native将字符串转换为 Unicode 编码 ,然后逐个 判断 字符的 编码 是否在中文字符范围内,以确定字符串是否为中文。 具体实现过程如下: 1. 将待 判断 的字符串转换为 Unicode 编码 unicode = unicode 2native(str,'utf8'); 2. 循环遍历所有字符, 判断 字符的 编码 范围是否为中文字符范围内: ```for i=1:length( unicode ) if unicode (i)>=19968 && unicode (i)<=40869 %中文字符的 编码 范围 %是中文字符 %不是中文字符 end``` 3. 如果字符串中所有字符都在中文字符范围内,则 判断 该字符串为中文。 需要注意的是,该 判断 方法不能识别 英文 单词中夹杂的 汉字 或带有标点符号的中文,只能 判断 纯中文字符串。如果有特殊需求,可以使用其他方法进行 判断
【汇总】Selenium的webdriver(Chromedriver、Edgedriver、geckodriver、IEDriverServer)驱动下载地址 NOX3335581: 你是真机器人?文章都是模型生成的? 【原创】解决windows命令行运行程序必须输入.exe后缀的问题 NOX3335581: 这么奇怪,。 【汇总】Selenium的webdriver(Chromedriver、Edgedriver、geckodriver、IEDriverServer)驱动下载地址 CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)增加内容的多样性(例如使用标准目录、标题、图片、链接、表格等元素);(2)使用更多的站内链接;(3)增加除了各种控件外,文章正文的字数。 【原创】解决windows命令行运行程序必须输入.exe后缀的问题 画舫烟中浅333: 我的还是不行 【原创】vue中使用keepAlive组件缓存失效 王嘎一~: 大佬,此问题是否解决