如何区分一个单词是半角还是全角?
Posted
技术标签:
【中文标题】如何区分一个单词是半角还是全角?【英文标题】:How to distinguish whether a word is half-width or full-width? 【发布时间】:2012-06-09 07:27:21 【问题描述】:最近我一直在处理混合语言的文本,包括中文、英文,甚至一些表情符号。
我一直在寻找这个问题很多,但我唯一能找到的是“用半角字符替换全角字符”而不是告诉你如何确定字符是否是半角-或全角字。
所以,我的问题是:
是否可以分辨一个单词是半角还是全角?
【问题讨论】:
通常,如果要检查文本,会将其放入兼容性分解形式,例如NFKD。如果这样做,全角拉丁字符变为正常(半角),半角假名/韩文字符变为正常(全角),从而更容易分析文本。你可以在 python 中使用import unicodedata; unicodedata.normalize('NKFD', text)
。
这是 NFKD,不是 NKFD。
【参考方案1】:
在 unicode 6.1 中,有 Halfwidth and Fullwidth forms
、pdf here 块。
在此块内,\uFF01-\uFF60
和 \uFFE0-\uFFE6
是全角,而 \uFF61-\uFFDC
和 \uFFE8-\uFFEE
是半角。
【讨论】:
\u00F01-\uFF60错了,应该是\uFF01-\uFF60 @Lelouchcr 已修复!感谢您在回答后 3 年的更正! 这并不是一个完整的答案。半角和全角形式之外的字符可以是半角或全角,因此仅使用该块图作为参考会使绝大多数 Unicode 未定义。 @LaurenceGonsalves 没有定义字符宽度的标准;这种现有的宽度指定(半/全)仅在某些情况下才有意义。另请参阅 this answer 关于wcwidth
,它将全宽指定为 2 列,而每隔一个普通字符指定为 1 列宽。【参考方案2】:
我认为这是一个很难回答的问题,除非您对什么是半角字符和什么是全角字符有明确的标准。如果您可以决定,那么您可以根据 Unicode(或任何编码方案)中的某些范围测试单词中的字符。
Unicode 块Halfwidth and Fullwidth Forms 仅向您显示哪些字符具有替代形式。对于此块中没有的任何内容,您必须确定您认为的半角和全角。
我想大多数西方字符是半角,大多数东方字符是全角,但两者都会有例外。正如this Unicode report 所强调的那样,也存在歧义。
This proposal 包括code,它似乎将字符分为全半角和模棱两可的宽度。您可以使用这些代码点作为起点。
【讨论】:
【参考方案3】:如果一个单词的字符是全角的,那么它就是全角的。您需要查看 unicode 规范并查看哪些字符范围是全角的,然后检查每个字符。
【讨论】:
以上是关于如何区分一个单词是半角还是全角?的主要内容,如果未能解决你的问题,请参考以下文章