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 -*- """汉字处理的工具:判断unicode是否是汉字,数字,英文,或者其他字符。全角符号转半角符号。""" __author__="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助手:
【原创】解决windows命令行运行程序必须输入.exe后缀的问题
画舫烟中浅333:
【原创】vue中使用keepAlive组件缓存失效
王嘎一~: