Autocad 使用什么无大小写匹配算法来比较图层名称?

What caseless matching algorithm does Autocad use to compare layer names?

Autocad DXF 和 DWG 文件使用 unicode 字符串来识别图层。我通过实验确定 Autocad 必须采用某种大小写折叠和规范化(Autocad 认为 'groß' 和 'GROSS' 相同,而 'Am\U+00e9lie' 和 'Ame\U+0301lie' 是相同的)。根据 Autocad,我想知道在我自己的软件中两个图层名称是否相同。 Unicode 标准的默认无大小写匹配算法似乎给了我正确的答案,但我想确定一下。

  1. 谁能证实默认无大小写匹配是Autocad使用的算法?或者如果它不是什么。

  2. 是否有我可以用来区分不同大小写匹配算法的测试输入?

我没有明确的答案,但是 Unicode standard 定义了四种无大小写匹配算法:

  1. 默认无大小写匹配 (D144):这仅使用(完全)大小写折叠但不进行归一化。既然你提到 Am\U+00e9lieAme\U+0301lie 匹配,那么肯定可以排除这种变体。

  2. 规范无大小写匹配(D145):除了大小写折叠外,它还使用(标准 NFC 或 NFD)归一化。

  3. 兼容性无大小写匹配(D146):除了大小写折叠外,它还使用了"compatibility"(NFKC 或 NFKD)规范化形式。

  4. Identifier caseless matching (D147): 类似于compatibility caseless matching 但也会忽略默认的可忽略字符。

所以我建议进行以下额外测试:

  • 如果\U+0133(LATIN SMALL LIGATURE IJ with a compatibility mapping)和ij匹配,那么Autocad似乎使用兼容性归一化和规范无大小写匹配(D145)即可排除了。

  • If A\U+00adB (SOFT HYPHEN with 属性 Default_Ignorable_Code_Point) 和 AB 匹配,然后 Autocad 似乎忽略默认可忽略字符和无大小写兼容性可以排除匹配(D146)

Autocad 当然有可能既不使用任何 Unicode 算法,但上面的测试应该有助于缩小范围。请考虑 post 任何其他发现以帮助其他用户。

我拦截了 api 调用并发现 Windows 上的 Autocad 2018 使用 CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, ...) 检查图层名称是否相等。