Python中如何判断一个字符是全角还是半角?
如题, 怎么判断一个字符是否为全角还是半角? 多谢您的回复!
Python中如何判断一个字符是全角还是半角?
9 回复
ord 一下 看是不是在 255 以下?
def is_fullwidth(char):
"""
判断单个字符是否为全角字符
全角字符的Unicode范围:
- 全角字母数字符号:FF00-FFEF
- 全角平假名/片假名:3040-309F, 30A0-30FF
- 全角中文标点:3000-303F
- CJK统一表意文字:4E00-9FFF(基本汉字)
- 扩展A区:3400-4DBF
"""
code = ord(char)
# 主要全角字符范围
fullwidth_ranges = [
(0xFF00, 0xFFEF), # 全角字母数字
(0x3000, 0x303F), # 中文标点
(0x3040, 0x309F), # 平假名
(0x30A0, 0x30FF), # 片假名
(0x4E00, 0x9FFF), # 基本汉字
(0x3400, 0x4DBF), # 扩展A区汉字
]
for start, end in fullwidth_ranges:
if start <= code <= end:
return True
# 检查其他全角字符(如全角空格)
if char == ' ': # 全角空格
return True
return False
def is_halfwidth(char):
"""
判断是否为半角字符
半角字符主要是ASCII字符和部分标点
"""
code = ord(char)
# ASCII字符(0-127)都是半角
if code <= 127:
return True
# 半角片假名范围(FF65-FF9F)
if 0xFF65 <= code <= 0xFF9F:
return True
return False
# 测试示例
test_chars = ['A', 'a', '1', '1', ',', ',', '。', '.', 'あ', 'ア', '中', ' ', ' ']
print("字符 | 全角 | 半角")
print("-" * 25)
for char in test_chars:
full = is_fullwidth(char)
half = is_halfwidth(char)
print(f"'{char}' | {full} | {half}")
# 实际使用示例
def analyze_string(text):
"""分析字符串中的全角/半角字符分布"""
results = []
for i, char in enumerate(text):
char_type = "全角" if is_fullwidth(char) else "半角"
results.append((i, char, char_type, hex(ord(char))))
return results
# 示例分析
sample = "Hello世界!123"
analysis = analyze_string(sample)
for idx, char, char_type, code in analysis:
print(f"位置{idx}: '{char}' -> {char_type} (Unicode: {code})")
这个实现的核心是通过Unicode码点范围判断。全角字符主要分布在几个特定区间:FF00-FFEF(全角字母数字)、3000-303F(中文标点)、4E00-9FFF(基本汉字)等。半角字符主要是ASCII字符(0-127)和半角片假名(FF65-FF9F)。
注意一个字符不能同时是全角和半角,但有些字符可能既不在全角范围也不在半角范围(如一些特殊符号)。实际使用时可以根据需要调整范围判断。
简单说就是查Unicode码点范围。
判断字符宽度
按编码
ASCII 大于 128
参考 http://stackoverflow.com/questions/10959227/how-to-distinguish-whether-a-word-is-half-width-or-full-width
半角字符使用 ord 返回对应的值, 全角字符使用 ord 会报异常.
也可以使用 unicode 值判断
转为 gb18030 编码,然后查看长度,等于 2 的就是全角,等于 1 的就是半角,这也是全角半角的本意吧
使用 len() 方法,返回字符长度,长度为 1 的是半角,长度为 2 为全角。
不知这样是否可行?
import unicodedata
unicodedata.east_asian_width(‘我’) # W (宽)
unicodedata.east_asian_width(‘i’) # Na (窄)

