我需要拆分一个字符串并提取由空白字符分隔的单词。来源可能是英文或日文。英文空白字符包括制表符和空格,日文文本也使用这些字符。 (IIRC,所有广泛使用的日语字符集都是US-ASCII的超集。)
因此,我需要用来分割字符串的字符集包括普通的ASCII空格和制表符。
但是,在日语中,还有另一个空格字符,通常称为“全宽空间”。根据我Mac的角色查看器实用程序,这是U + 3000“IDEOGRAPHIC SPACE”。这是(通常)当用户在日语输入模式下键入空格键时会产生的结果。
我还需要考虑其他角色吗?
我正在处理被告知“用空格分隔条目”的用户提交的文本数据。但是,用户正在使用各种计算机和移动电话操作系统来提交这些文本。我们已经看到用户在输入此数据时可能不知道他们是处于日语输入模式还是英语输入模式。
此外,即使在日语模式下,空格键的行为也会因平台和应用程序而异(例如,Windows 7将插入表意空间,但iOS将插入ASCII空间)。
所以我想要的基本上是“视觉上看起来像空格的所有角色的集合,可能是在用户按空格键时生成的,或者是tab键,因为许多用户不知道空格和空格之间的区别选项卡,日语和/或英语“。
对这样的问题有任何权威的答案吗?
答案 0 :(得分:4)
您需要ASCII选项卡,空格和不间断空格(U + 00A0)以及您已正确识别为U + 3000的全宽空格。您可能需要换行符和垂直空格字符。如果您的输入是unicode(不是Shift-JIS等),那么这就是您所需要的。还有其他(控制)字符,例如\ 0 NULL,有时用作信息分隔符,但它们不会在东亚文本中呈现为空格 - 即它们不会显示为空格。
编辑:Matt Ball在他的评论中有一个很好的观点,但是,正如他的例子所示,许多正则表达式的实现并不能很好地处理整个东亚标点符号。在这方面,值得一提的是,Python的string.whitespace
也不会削减芥末。
答案 1 :(得分:3)
我刚发现你的帖子。这是关于规范化Unicode字符的一个很好的解释。
http://en.wikipedia.org/wiki/Unicode_equivalence
我发现许多编程语言(如Python)都有可以按Unicode标准实现这些规范化规则的模块。为了我的目的,我发现以下python代码非常有效。它将空白的所有unicode变体转换为ascii范围。规范化后,正则表达式命令可以将所有空格转换为ascii \ x32:
import unicodedata
# import re
ucode = u'大変、 よろしくお願い申し上げます。'
normalized = unicodedata.normalize('NFKC', ucode)
# old code
# utf8text = re.sub('\s+', ' ', normalized).encode('utf-8')
# new code
utf8text = ' '.join(normalized.encode('utf-8').split())
自第一次写作以来,我学习了Python的正则表达式(re)模块不正确地识别这些空格字符,并且如果遇到则会导致崩溃。事实证明,使用.split()函数的方法更快,更可靠。