Работа с UTF8
Это кажется довольно сложной проблемой для работы с std::string и UTF8, и я не могу найти хорошее объяснение того, что можно и чего нельзя делать.
Как я могу правильно работать с UTF8 в C++? Это довольно запутанно.
я обнаружил boost::locale
и я установил глобальную локаль:
std::locale::global(boost::locale::generator()(""));
Однако после этого мне нужно подумать, когда у меня могут возникнуть проблемы? Будет ли запись / чтение из файла работать должным образом, сравнение строк и т. Д.?
До сих пор я знаю следующее:
std::regex
/boost::regex
не сработает, при необходимости охватить широкие струны и использовать wregex.boost::algorithm::to_upper
не будет работать, нужно использоватьboost::locale::to_upper
Кроме того, что мне нужно знать?
1 ответ
Добро пожаловать в великолепный мир Unicode.
- Сожалею,
wchar_t
определяется реализацией, и, как правило, в Windows будет недостаточно поддерживать полный код для азиатских сценариев (например) - Вы можете использовать сравнения для поиска, но для сортировки данных и представления их аудитории вам потребуется полный алгоритм сопоставления. Знайте, например, что порядок в немецком словаре отличается от порядка в немецкой телефонной книге (и плачь...)
- Вообще говоря, я бы посоветовал не преобразовывать строки самостоятельно. Алгоритмы Boost.Locale должны работать в целом, поскольку они обертывают ICU, но в противном случае воздерживаются от специальных операций.
- Если вы разбили строку на несколько частей, не разбивайте ее на части. Слишком легко либо разделить символ на два (даже с помощью алгоритмов с учетом кодовой точки, из-за диакритики), либо даже избежать этого, разделить между двумя символами (потому что некоторые культуры рассматривают определенные комбинации смежных символов как один).