У меня есть требование, в котором мой код на C++ должен делать нечувствительное к регистру сравнение, не беспокоясь о том, закодирована ли строка или нет, или тип кодирования. Строка может быть ASCII или не-ASCII, мне просто нужно сохранить ее как есть и сравнить ее со второй строкой, не касаясь правильного языкового стандарта и т. Д.Как добиться unicode-agnostic нечувствительности к регистру в C++
Use case: Предположим, что мое приложение получает строку (предположим, что это имя файла) сначала как «Zoë Saldaña.txt», и сохраняет ее как есть. Впоследствии он получает еще одну строку «zoë saLdañA.txt», а сравнение между этой и первой строкой должно приводить к совпадению с использованием нескольких API. То же самое с именем файла «abc.txt» и «AbC.txt».
Я прочитал о ICU IBM и как он использует кодировку UTF-16 по умолчанию. Мне интересно знать:
Если СИС предоставляет средства решений моих требований по бесшовно обработкам строк, независимо от их типа кодирования?
Если ответ на вопрос 1. нет, то с использованием API-интерфейсов ICU безопасно нормализовать все строки (как ASCII, так и не ASCII) до UTF-16, а затем провести сравнение без учета регистра и другие операции ?
Есть ли альтернативы, которые облегчают это?
Я прочитал это post, но это не совсем соответствует моим требованиям.
Спасибо!
Вы не можете сделать без учета регистра сравнения, не зная локаль. В Турции «ФАЙЛ» должен * не * соответствовать «файлу». («FİLE» должен соответствовать «файлу», а «ФАЙЛ» должен соответствовать «fıle»). В случае, если это не очевидно, у турецкого есть пунктир-i, (i и İ) и бесцеремонный-i (ı и я). –
Как закодированы ваши строки? Вы не можете сделать ничего полезного, если вы хотя бы не знаете, что такое кодировка источника. –
Практический пример действительно немного глупо. Для имен файлов вы не можете произвольно решить, что они нечувствительны к регистру. Файлы в большинстве файловых систем, подобных Unix, зависят от вашего регистратора, независимо от того, нравится вам это или нет. Для Windows/NTFS они не чувствительны к регистру, используя таблицу case, хранящуюся на этом диске_! – MSalters