Веду разработку на операционной системе macOS. Возникают кучи проблем с кириллицей (string или char*), например, при работе с функциями regex, ::tolower/::toupper и тд.
При запросе locale в терминале, имею следующее:
LANG="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_CTYPE="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_ALL=
Использую C++11. Boost принципиально использовать не хочу и, желательно, чтобы решение могло быть перенесено в будущем на линкус (отсылка к непереносимому codecvt).
Собственно сам вопрос: как можно исправить проблему кириллицы во всей программе? Например, использовать грамотно locale.h (и как это - грамотно?) или что-нибудь еще.
UPD:
Вывод текста я осуществляю непосредственно в консоль. В консоль вывод происходит отлично, вот только преобразования через transform, используя параметры ::tolower, ::toupper успешно игнорируются. Используя codecvt я смог получить из string -> wstring, выполнил ::tolower и смог так же сделать wstring->string, однако, это явный "костыль" и использовать его всегда, когда мне надо что-то сделать с байтами строки - не выход.
Если я вывожу русский текст в ncurses, получается так:
(Я какой-то текст) "Я какой-?~Bо ?~Bек?~A?~B"
Ответ
Очень понимаю ваше желание не использовать Boost(тоже такой принцип).
Что бы раз и навсегда забыть о проблемах с кодировкой лучше всего использовать utf8 и в STL есть его реализация wstring
wstring str = u8"кириллический текст";//u8 преобразует ansi символы в utf8.
Используя wstring о проблемах с локалью можно забыть.
Из плюсов это переносимость на всё что угодно, а из минусов это повышенное потребление памяти(не смертельно но всё же).
И, кстати говоря, считается правилом хорошего тона не использовать std::wcout и std::cout (равно как и пару std::wcin и std::cin) в пределах одного приложения(есть проблемы их совместного использования).
Комментариев нет:
Отправить комментарий