Autocad用什么无壳匹配算法来比较图层名称?

时间:2018-02-12 03:24:17

标签: unicode autocad unicode-normalization teigha

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

  1. 任何人都可以遵守默认无壳匹配是Autocad使用的算法吗?或者如果不是那样的话。

  2. 我是否可以使用测试输入来区分不同的无壳匹配算法?

2 个答案:

答案 0 :(得分:1)

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

  1. 默认无壳匹配(D144):这仅使用(完整)案例折叠但不进行规范化。由于您提到Am\U+00e9lieAme\U+0301lie匹配,因此绝对可以排除此变体。

  2. 标准无壳匹配(D145):除了表壳折叠之外,它还使用(标准NFC或NFD)标准化。

  3. 兼容性无外壳匹配(D146):这使用"兼容性" (NFKC或NFKD)标准化形式以及案例折叠。

  4. 标识符无标记匹配(D147):与兼容性无标记匹配类似,但也忽略默认可忽略字符。

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

    • 如果\U+0133(带有兼容性映射的LATIN SMALL LIGATURE IJ)和ij匹配,则Autocad似乎使用兼容性规范化,并且可以排除规范无壳匹配(D145)。 / p>

    • 如果A\U+00adB(SOFT HYPHEN与属性Default_Ignorable_Code_Point)和AB匹配,则Autocad似乎忽略默认可忽略字符,并且可以排除兼容性无情匹配(D146)。

    Autocad当然可能不使用任何Unicode算法,但上述测试应该有助于缩小它。请考虑发布任何其他调查结果以帮助其他用户。

答案 1 :(得分:0)

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