LINUX.ORG.RU

История изменений

Исправление bonta, (текущая версия) :

Я бы разделил логику апы и системнозависимое. Чтобы этих самых системнозависимых штук не было вообще видно в основном коде. А там, в системно зависимых файлах уже сделать ifdef...

Ну и я когда что-то подобное делал сделал две отдельные сущности:

1. Это непосредственно функциональность работы с кодировками.

2. Это входящие аргументы, в объекты пункта 1, они содержат в себе (или хардкорно вшитые параметры, или по феншую полученные через запрос-ответ соответствующих системных апи данные для работы функциональности пункта 1)

В итоге например у меня с кодировками работа была обёрнута так:

 jsonWriter.String(Utils::Misc::EnvToAppEncoding(classInfo.second.path,LocaleSet::getInstance().getFileSystemEncoding()));

//path - строка полученная из внешнего мира (операционка)
//getFileSystemEncoding - возвращает кодировку
//EnvToAppEncoding - преобразует из внешней кодировки во внутреннюю кодировку аппы - utf-16 или 32, не помню что уже там, винде одна в линуксе другая, в общем в wchar_t строку :)

Еще в винде до сих пор в 2020 в консоли для кириллицы используется cp-866 по дефолту, соответственно чтобы консоль выводила правильно киррилицу нужно выбрать какое-то решение.

Имхо, самое лучшее и простое - это учитвать это в программе, и подстаивать вывод из стандартных Си++ потоков в стандартную для консоли кодировку.

Существуют способы переключить по запросу приложения консоль в режим utf-8. Еще не помню точно, но вроде этот способ влечет за собой еще необходимость сменить в настройках консоли шрифт на какой-то определённый иначе не будут отображаться какие-то символы или типа того — короче на мой взгляд это плохой и тяжелый путь и я первый вариант лучше.

При этом если из консольной аппы ты захочешь файлы читать, то кодировка имен в файлах будет cp1251 :)

--- А еще utf-cpp либа мне помогла, посмотри на неё.

Исходная версия bonta, :

Я бы разделил логику апы и системнозависимое. Чтобы этих самых системнозависимых штук не было вообще видно в основном коде. А там, в системно зависимых файлах уже сделать ifdef...

Ну и я когда что-то подобное делал сделал две отдельные сущности:

1. Это непосредственно функциональность работы с кодировками.

2. Это входящие аргументы, в объекты пункта 1, они содержат в себе (или хардкорно вшитые параметры, или по феншую полученные через запрос-ответ соответствующих системных апи данные для работы функциональности пункта 1)

В итоге например у меня с кодировками работа была обёрнута так:

 jsonWriter.String(Utils::Misc::EnvToAppEncoding(classInfo.second.path, DiglexUtils::LocaleSet::getInstance().getFileSystemEncoding()).c_str());

//path - строка полученная из внешнего мира (операционка)
//getFileSystemEncoding - возвращает кодировку
//EnvToAppEncoding - преобразует из внешней кодировки во внутреннюю кодировку аппы - utf-16 или 32, не помню что уже там, винде одна в линуксе другая, в общем в wchar_t строку :)

Еще в винде до сих пор в 2020 в консоли для кириллицы используется cp-866 по дефолту, соответственно чтобы консоль выводила правильно киррилицу нужно выбрать какое-то решение.

Имхо, самое лучшее и простое - это учитвать это в программе, и подстаивать вывод из стандартных Си++ потоков в стандартную для консоли кодировку.

Существуют способы переключить по запросу приложения консоль в режим utf-8. Еще не помню точно, но вроде этот способ влечет за собой еще необходимость сменить в настройках консоли шрифт на какой-то определённый иначе не будут отображаться какие-то символы или типа того — короче на мой взгляд это плохой и тяжелый путь и я первый вариант лучше.

При этом если из консольной аппы ты захочешь файлы читать, то кодировка имен в файлах будет cp1251 :)

--- А еще utf-cpp либа мне помогла, посмотри на неё.