所有的日语空白字符是什么?

12
我需要拆分字符串并提取由空白字符隔开的单词。源可以是英语或日语。 英语空格字符包括制表符和空格,日本文本也使用这些字符。 (如果我没记错的话,所有广泛使用的日语字符集都是US-ASCII的超集。)
因此,我需要用于拆分字符串的字符集包括常规ASCII空格和制表符。
但是,在日语中,还有另一个空格字符,通常称为“全角空格”。根据我的Mac的Character Viewer实用程序,这是U + 3000“IDEOGRAPHIC SPACE”。这通常是用户在日语输入模式下键入时按下空格键时的结果。
还有其他需要考虑的字符吗?
我正在处理由用户提交的文本数据,告知他们“用空格分隔条目”。然而,用户使用各种计算机和移动电话操作系统来提交这些文本。 我们已经看到用户可能不知道他们在输入此数据时处于日语还是英语输入模式。
此外,即使在日语模式下,空格键的行为也因平台和应用程序而异(例如,Windows 7将插入一个表意空格,但iOS将插入ASCII空格)。
因此,我想要的基本上是“所有外观类似于空格且在用户按下空格键或制表键时可能生成的字符集,在日语和/或英语中”。
是否有任何权威的答案可以回答这样的问题?

1
任何具备适当Unicode支持的编程语言都应该允许您使用正则表达式在空格上拆分字符串,不是吗?例如,在JavaScript中,/\s/匹配空格字符(相当于[ \f\n\r\t\v\u00A0\u2028\u2029])。 - Matt Ball
3
Matt说你引用的正则表达式已经缺少了\u3000,问题提出者想知道还有什么别的字符也可能会缺少。Unicode分隔符空格列表有18个条目:http://www.fileformat.info/info/unicode/category/Zs/list.htm - Gabe
1
马特:是啊,我希望可以,但是JavaScript(甚至Ruby)对于什么构成通用的“空格”的概念并不包括日语的空格字符? 加布:感谢您提供的链接,在我的Unicode查看器中手动浏览时,我已经发现了EM SPACE、FIGURE SPACE等字符,但还没有遇到OGHAM SPACE MARK或MONGOLIAN VOWEL SEPARATOR... - Mason
1
就我所知,\uFFE3(上划线)也被用作全角空格(在日本网络上)。 - makdad
@taylor,对日语文本进行分词是很困难的。是的,他们有句号(句点)类型的标点符号,但更多地用于完成几个构成一个思想的句子(考虑段落)。据我所知,单词通常使用Trie数据结构或类似的东西进行分词,但您必须考虑句子的上下文来正确区分实际被分词的单词。 - ThaDon
显示剩余2条评论
2个回答

5
您需要使用ASCII制表符、空格和不间断空格(U+00A0)、以及您已经正确标识为U+3000的全角空格。您可能还需要换行符和垂直间距字符。如果您的输入是Unicode(而不是Shift-JIS等),那么这就是您需要的全部内容。还有其他(控制)字符,如\0 NULL,有时用作信息分隔符,但它们不会在东亚文本中呈现为空格,即它们不会显示为空白字符。
编辑:Matt Ball在他的评论中提出了一个很好的观点,但正如他的示例所说明的那样,许多正则表达式的实现不能很好地处理全角的东亚标点。在这方面,值得一提的是Python的string.whitespace也无法胜任。

我真的很想相信你,因为那意味着我完成了!:) 但是,你怎么知道呢? - Mason
1
我每天都在处理来自不同来源的东亚文本。您使用的是哪种编程语言/环境?也许我可以给出更具体的建议。Gabe链接中的正则表达式是否足够适用于您的情况? - simon
你说得对;虽然我最终编写了一个处理Matt链接中所有奇怪空格的方法,但我还手动测试了从24个不同平台/应用程序组合提交。在现实世界中,制表符、空格、U+00A0和U+3000是唯一出现的。因此,我接受了你的答案。谢谢! - Mason

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()函数是一种更快、更可靠的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接