Как читать/записывать китайские/японские иероглифы из/в файлы INI?

Использование WritePrivateProfileString и GetPrivateProfileString приводит к ??? вместо реальных символов.


person Community    schedule 15.10.2008    source источник


Ответы (4)


GetPrivateProfileString() и WritePrivateProfileString() будут работать с Юникодом.

Если ini-файл имеет кодировку UTF-16LE, т. е. имеет спецификацию UTF-16, то функции будут работать в Unicode. Однако, если функции должны создать файл, они создадут файл ANSI и будут работать только в ANSI.

Поэтому, чтобы использовать функции с Unicode, создайте свой ini-файл перед его первым использованием и напишите в нем метку порядка байтов UTF-16LE. Затем продолжайте как обычно.

Обратите внимание, что функции вообще не работают с UTF-8.

См. блог Майкла Каплана, чтобы получить больше подробностей, чем вы когда-либо хотели узнать об этом. .

person Roger Bamforth    schedule 11.01.2012

Функция WritePrivateProfileStringW запишет INI-файл в устаревшей системной кодировке (например, Shift-JIS в японской системе), поскольку это устаревшая функция поддержки. Если вы хотите иметь INI-файл, полностью поддерживающий Unicode, вам потребуется использовать внешнюю библиотеку.

Попробуйте SimpleIni http://code.jellycan.com/simpleini/

Это C++, один заголовочный файл, библиотека шаблонов с лицензией MIT (т.е. коммерческое использование допустимо). Включите его в исходный файл и используйте. Он кроссплатформенный, поддерживает UTF-8 и устаревшие кодированные файлы, а также может читать и записывать INI-файл, в значительной степени сохраняя комментарии, структуру и т. д. Проще всего проверить страницу.

Он существует уже некоторое время и, похоже, используется довольно многими людьми. Я его написал и продолжаю поддерживать.

person brofield    schedule 22.04.2009

Согласно документации WritePrivateProfileString, существует версия Unicode: WritePrivateProfileStringW. Используйте это, и вы сможете использовать символы Unicode.

person Chris Jester-Young    schedule 15.10.2008
comment
кодировка файла ini должна быть utf-16le. - person Jichao; 09.07.2015
comment
WritePrivateProfileStringW создает новый файл в кодировке ASCII, но обычно работает с UTF-16LE, если файл с этой кодировкой был создан ранее. - person Mikhail Pilin; 28.01.2020

Это может быть просто проблема с тем, как вы отображаете или обрабатываете строки. Например, обычное окно консоли не может отображать японские строки с помощью printf.

Можете ли вы опубликовать часть своего кода?

person moogs    schedule 15.10.2008