Вот небольшое обсуждение Я начал некоторое время назад на эту тему.
В принципе, я бы лично выделил два отдельных пути обработки кодирования:
Один - это независимый от кодирования «внутренне переносимый» путь, который использует mbstowcs
для преобразования внешних многобайтовых данных из char * argv[]
и преобразования их во внутреннюю строку с фиксированной шириной, причем все, даже не говоря о кодировках.
Другой является сериализуемым путем с фиксированным кодированием, который обрабатывает данные, которые отправляются в детерминированных кодировках.Для их перевода библиотека Posix iconv
делает свое дело.
Вы можете соединить два пути, используя специальную кодировку iconv
WCHAR_T.
Поскольку описываемая вами ситуация требует от вас чтения сериализованных детерминированных данных, я бы предложил использовать iconv для преобразования из UTF8 (который, как вы знаете, у вас есть) и преобразования в WCHAR_T, который затем можно обработать с помощьюстандартные строковые функции в Си (но не делайте предположений о фактической кодировке).Если вам нужно вывести данные на консоль, вы всегда можете wcstombs
из ваших внутренних широких строк в многобайтовое представление (подробности о котором вас не интересуют), которое консоль сказала вам, что хочет.