Использование WritePrivateProfileString и GetPrivateProfileString приводит к ??? вместо реальных символов.
Как читать/записывать китайские/японские иероглифы из/в файлы INI?
Ответы (4)
GetPrivateProfileString() и WritePrivateProfileString() будут работать с Юникодом.
Если ini-файл имеет кодировку UTF-16LE, т. е. имеет спецификацию UTF-16, то функции будут работать в Unicode. Однако, если функции должны создать файл, они создадут файл ANSI и будут работать только в ANSI.
Поэтому, чтобы использовать функции с Unicode, создайте свой ini-файл перед его первым использованием и напишите в нем метку порядка байтов UTF-16LE. Затем продолжайте как обычно.
Обратите внимание, что функции вообще не работают с UTF-8.
См. блог Майкла Каплана, чтобы получить больше подробностей, чем вы когда-либо хотели узнать об этом. .
Функция WritePrivateProfileStringW запишет INI-файл в устаревшей системной кодировке (например, Shift-JIS в японской системе), поскольку это устаревшая функция поддержки. Если вы хотите иметь INI-файл, полностью поддерживающий Unicode, вам потребуется использовать внешнюю библиотеку.
Попробуйте SimpleIni http://code.jellycan.com/simpleini/
Это C++, один заголовочный файл, библиотека шаблонов с лицензией MIT (т.е. коммерческое использование допустимо). Включите его в исходный файл и используйте. Он кроссплатформенный, поддерживает UTF-8 и устаревшие кодированные файлы, а также может читать и записывать INI-файл, в значительной степени сохраняя комментарии, структуру и т. д. Проще всего проверить страницу.
Он существует уже некоторое время и, похоже, используется довольно многими людьми. Я его написал и продолжаю поддерживать.
Согласно документации WritePrivateProfileString, существует версия Unicode: WritePrivateProfileStringW. Используйте это, и вы сможете использовать символы Unicode.
WritePrivateProfileStringW создает новый файл в кодировке ASCII, но обычно работает с UTF-16LE, если файл с этой кодировкой был создан ранее.
- person Mikhail Pilin; 28.01.2020
Это может быть просто проблема с тем, как вы отображаете или обрабатываете строки. Например, обычное окно консоли не может отображать японские строки с помощью printf.
Можете ли вы опубликовать часть своего кода?