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 标准的默认无大小写匹配算法似乎给了我正确的答案,但我想确定一下。
谁能证实默认无大小写匹配是Autocad使用的算法?或者如果它不是什么。
是否有我可以用来区分不同大小写匹配算法的测试输入?
我没有明确的答案,但是 Unicode standard 定义了四种无大小写匹配算法:
默认无大小写匹配 (D144):这仅使用(完全)大小写折叠但不进行归一化。既然你提到 Am\U+00e9lie
和 Ame\U+0301lie
匹配,那么肯定可以排除这种变体。
规范无大小写匹配(D145):除了大小写折叠外,它还使用(标准 NFC 或 NFD)归一化。
兼容性无大小写匹配(D146):除了大小写折叠外,它还使用了"compatibility"(NFKC 或 NFKD)规范化形式。
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, ...)
检查图层名称是否相等。
Autocad DXF 和 DWG 文件使用 unicode 字符串来识别图层。我通过实验确定 Autocad 必须采用某种大小写折叠和规范化(Autocad 认为 'groß' 和 'GROSS' 相同,而 'Am\U+00e9lie' 和 'Ame\U+0301lie' 是相同的)。根据 Autocad,我想知道在我自己的软件中两个图层名称是否相同。 Unicode 标准的默认无大小写匹配算法似乎给了我正确的答案,但我想确定一下。
谁能证实默认无大小写匹配是Autocad使用的算法?或者如果它不是什么。
是否有我可以用来区分不同大小写匹配算法的测试输入?
我没有明确的答案,但是 Unicode standard 定义了四种无大小写匹配算法:
默认无大小写匹配 (D144):这仅使用(完全)大小写折叠但不进行归一化。既然你提到
Am\U+00e9lie
和Ame\U+0301lie
匹配,那么肯定可以排除这种变体。规范无大小写匹配(D145):除了大小写折叠外,它还使用(标准 NFC 或 NFD)归一化。
兼容性无大小写匹配(D146):除了大小写折叠外,它还使用了"compatibility"(NFKC 或 NFKD)规范化形式。
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, ...)
检查图层名称是否相等。