История изменений
Исправление 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 либа мне помогла, посмотри на неё.