Autocad DXF和DWG文件使用unicode字符串来识别图层。我已经通过实验确定Autocad必须采用某种形式的折叠和标准化(Autocad认为'groß'和'GROSS'是相同的,'Am \ U + 00e9lie'和'Ame \ U + 0301lie'是相同)。我想在我自己的软件中知道根据Autocad,两个图层名称是否相同。 Unicode标准的默认无壳匹配算法似乎给了我正确的答案,但我想确定。
任何人都可以遵守默认无壳匹配是Autocad使用的算法吗?或者如果不是那样的话。
我是否可以使用测试输入来区分不同的无壳匹配算法?
答案 0 :(得分:1)
我没有明确的答案,但Unicode standard定义了四种无情匹配的算法:
默认无壳匹配(D144):这仅使用(完整)案例折叠但不进行规范化。由于您提到Am\U+00e9lie
和Ame\U+0301lie
匹配,因此绝对可以排除此变体。
标准无壳匹配(D145):除了表壳折叠之外,它还使用(标准NFC或NFD)标准化。
兼容性无外壳匹配(D146):这使用"兼容性" (NFKC或NFKD)标准化形式以及案例折叠。
标识符无标记匹配(D147):与兼容性无标记匹配类似,但也忽略默认可忽略字符。
所以我建议进行以下额外测试:
如果\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, ...)
来检查图层名称是否相等。