LINUX.ORG.RU

Можно ли как-то, и как, в C++ получить std::locale UTF-8 без указания языка_региона?

 , ,


0

1

Допустим мне нужен UTF-8, но без разницы какой язык и регион, например, для того, что бы конвертировать текст между UTF-8 и wchar_t. Мой код не знает и не хочет знать какие там язык и регион, просто получить UTF-8, а остальные параметры по умолчанию. На офтопике, к примеру, можно позвать std::locale(«.UTF-8»), и это работает, но мне нужно кроссплатформенно, или хотя бы для GNU/Linux. Такое возможно?

★★★

Нет, наличие в системе локали с поддержкой UTF-8 не гарантировано даже на GNU/Linux, не говоря уже о произвольной POSIX-совместимой ОС.

Де-факто, wchar_t в наши дни содержит номера Unicode code points. Де-юре, это тоже не гарантировано; кроме того, тесты на CRAN показывали, что это предположение ломалось на некоторых версиях Solaris.

Вы можете попробовать GNU libiconv, но преобразование в wchar_t там работает через определённые костыли, впрочем, портированные на самые разные ОС. Вы также можете попробовать libicu и делать всё в UTF-8, не трогая wchar_t.

anonymous
()
Ответ на: комментарий от dataman

Зато добавили text_encoding.

Это конечно радует. Но выходит, что при переходе на С++26 придется переписывать код.

Например, uni-algo 0.8.0 - библиотека алгоритмов Unicode для C++.

А это спасибо.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)

строго говоря, ширина wchar_t зависит от компилятора (и платформы) и не является универсальной. стандартизированы только char16_t и char32_t.

Iron_Bug ★★★★★
()