Работа с 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.

  1. Сожалею, wchar_t определяется реализацией, и, как правило, в Windows будет недостаточно поддерживать полный код для азиатских сценариев (например)
  2. Вы можете использовать сравнения для поиска, но для сортировки данных и представления их аудитории вам потребуется полный алгоритм сопоставления. Знайте, например, что порядок в немецком словаре отличается от порядка в немецкой телефонной книге (и плачь...)
  3. Вообще говоря, я бы посоветовал не преобразовывать строки самостоятельно. Алгоритмы Boost.Locale должны работать в целом, поскольку они обертывают ICU, но в противном случае воздерживаются от специальных операций.
  4. Если вы разбили строку на несколько частей, не разбивайте ее на части. Слишком легко либо разделить символ на два (даже с помощью алгоритмов с учетом кодовой точки, из-за диакритики), либо даже избежать этого, разделить между двумя символами (потому что некоторые культуры рассматривают определенные комбинации смежных символов как один).
Другие вопросы по тегам