Какой алгоритм сопоставления без учета регистра использует Autocad для сравнения имен слоев?

В файлах Autocad DXF и DWG для определения слоев используются строки Unicode. Я экспериментально определил, что Autocad должен использовать своего рода свертывание и нормализацию (Autocad считает, что 'groß' и 'GROSS' - это то же самое, а 'Am\U+00e9lie' и 'Ame\U+0301lie' - как так же). Я хотел бы знать в моем собственном программном обеспечении, совпадают ли два имени слоя согласно Autocad. Стандартный алгоритм Caseless Matching из стандарта Unicode, кажется, дает мне правильный ответ, но я бы хотел быть уверенным.

  1. Кто-нибудь может подтвердить, что сопоставление по умолчанию без учета регистра - это алгоритм, используемый Autocad? Или если это не то, что есть.

  2. Могу ли я использовать тестовые входы, чтобы различать разные алгоритмы сопоставления без учета регистра?

2 ответа

Решение

Я перехватил вызовы API и обнаружил, что Autocad 2018 на Windows использует CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, ...) проверить имена слоев на равенство.

У меня нет определенного ответа, но стандарт Unicode определяет четыре алгоритма для сопоставления без учета регистра:

  1. Соответствие без учета регистра по умолчанию (D144): используется только (полное) сворачивание регистра, но без нормализации. Так как вы упомянули, что Am\U+00e9lie а также Ame\U+0301lie матч, этот вариант определенно можно исключить.

  2. Каноническое сопоставление без учета регистра (D145): при этом используется нормализация (стандартная NFC или NFD) в дополнение к складыванию регистра.

  3. Совместимость без учета регистра (D146): в дополнение к сворачиванию регистра используется форма нормализации "совместимость" (NFKC или NFKD).

  4. Идентификатор без учета регистра (D147): Подобно совместимости без учета регистра, но также игнорирует символы Ignorable по умолчанию.

Поэтому я бы предложил следующие дополнительные тесты:

  • Если \U+0133 (LATIN SMALL LIGATURE IJ с сопоставлением совместимости) и ij сопоставление, тогда Autocad, похоже, использует нормализацию совместимости, и каноническое сопоставление без учета регистра (D145) можно исключить.

  • Если A\U+00adB (МЯГКИЙ ГИФЕН со свойством Default_Ignorable_Code_Point) и AB сопоставить, тогда Autocad, кажется, игнорирует символы по умолчанию Ignorable, и совместимость без учета регистра (D146) может быть исключена.

Конечно, возможно, что Autocad не использует ни один из алгоритмов Unicode, но приведенные выше тесты должны помочь сузить его. Пожалуйста, рассмотрите возможность опубликовать любые дополнительные выводы, чтобы помочь другим пользователям.

Другие вопросы по тегам