6

UTS#18中描述了各种级别的 Unicode 正则表达式支持。

有没有办法对每个需求进行一些测试,因此可以将测试移植到相关语言,运行它们并收集结果?

其他 Unicode 文档是否也有支持级别的概念,例如字符串实现/库?

4

2 回答 2

7

作为记录,ICU4C 和 Perl 都支持 UTS#18 Level 1 以及几个重要的 Level 2 特性。这些包括带有 的命名字符、带有\N{...}的字形\X、完整的属性\p{East_Asian_Width=Full_Width},例如 ICU,还包括通过调整的\b. 所有这三个 Level-2 正则表达式功能都显着简化了在 Unicode 上使用正则表达式,没有它们,你最多只能做不愉快的事情,最坏的情况是根本无法做到。

Perl 和 ICU4C 虽然有些不同,因为 Perl 支持完全基于字符串的大小写折叠,而 ICU 只支持简单的基于字符的大小写折叠。Perl 也有很多 ICU 不支持的非 Unicode 正则表达式扩展,例如你的正则表达式中的环视和命名组,它们都非常有用。

Perl 还允许用户定义/自定义属性和命名字符,这对很多事情都很有用,包括私有使用区域 (PUA) 代码点,因为您现在可以为您喜欢使用的任何 PUA 字符定义自己的名称和属性。(例如,对于计划包含在 Unicode 中的脚本,例如非官方的 ConScript 注册表中的脚本。)

在最近发布的 JDK7 之前,Java 甚至不支持 UTS#18 Level 1,而且只支持最低限度。对于 Java6 或更早版本,各种小东西都是错误的或缺失的。总而言之,JDK 中 Java 的 Unicode 支持非常弱:对于任何严肃的 Unicode 工作,您应该使用 ICU4J 的UCharacteretc 类,而不是OraSun 类,否则您会发疯的。真的。

但除了这几个之外,没有什么比这更接近了。 如果你很小心并且不需要做太多事情,你有时可以在 Python 或 Ruby 中跛行:例如,没有排序或搜索,几乎没有 Unicode 字符属性,甚至没有正确的单词边界等。

尝试在 Javascript 或 PHP 中使用 Unicode 做任何事情的人应该在开始之前退出。这太痛苦了,因为如果不访问字符属性和可能的​​字素,就无法以任何有用或现实的方式操作 Unicode。

还有跨语言的 Unicode 问题,如大小写映射和大小写折叠、规范化、换行和整理,所有这些都因语言而异。对于 Unicode 工作,您需要访问大部分(如果不是全部的话)。几乎所有语言都没有完整的属性支持是一个真正的问题,因为字符属性是许多算法所依赖的基础。

我在我的Unicode Support Shootout演讲中谈到了大部分内容。

底线

最重要的是,在撰写本文时,如果您不能使用 ICU 正则表达式或 Perl 本身(但不能使用 PCRE),或者也不能使用regexPython 中的 Matthew Barnett 库,那么您基本上就被 Unicode 正则表达式搞砸了。尽管 Unicode 已有 20 年的历史,但目前没有其他人足够认真地对待正则表达式和/或 Unicode。

这对 Javascript 和 PHP 等“webbish”语言具有严重影响,因为没有可用的替代方案,因此您必须将任何实际工作卸载到不同的服务器端语言,因为 webbish 语言无法以任何合理的方式处理 Unicode时尚。在客户端根本没有任何东西可以工作,这是一个沉重的负担。

另外,请注意,通过 Java 获取 ICU 正则表达式需要滚动您自己的 JNI(或使用来自 Android 的 JNI)来获取 ICU4C:ICU 正则表达式没有 ICU4J 绑定。

于 2011-08-20T04:09:22.527 回答
3

我想在某处存在验证支持水平的现有测试。
例如,在 Perl 中,有相当广泛的文档在正则表达式的
Unicode 支持和语言中的一般 Unicode 支持。

示例 Perl 正则表达式支持级别文档: http:
//perldoc.perl.org/perlunicode.html#Unicode-Regular-Expression-Support-Level

不过,Unicode 非常复杂,测试用例将来自语言编写者。

于 2011-08-19T19:37:01.523 回答