如何使用扩展字符集读取ini文件? (C++ 语言。)

How to use extended character set in reading ini file? (C++ lang.)

我遇到一个小问题。我来自在语言中使用扩展字符集的国家(特别是拉丁语 Extended-A,因为 š、č、ť、ý、á、...)。

我有包含这些字符的 ini 文件,我想将它们读入程序。不幸的是,它不适用于 getPrivateProfileStringW 或 ...A.

这是部分源代码。我希望它能帮助别人找到解决方案,因为我有点绝望了。 :-)

源代码:

wchar_t pcMyExtendedString[200];    

GetPrivateProfileStringA(
             "CATEGORY_NAME",
             "SECTION_NAME",
             "error",
             pcMyExtendedString,
             200,
             PATH_TO_INI_FILE
             );

INI 文件:

 [CATEGORY_NAME]
 SECTION_NAME= ľščťžýáíé

字符 ý、á、í、é 已正确读取 - 它们来自字符集 Latin-1 Supplement。它们的六进制值是正确的(0xFD、0xE1、0xED,...)。

字符 ľ,š,č,ť,ž 读取不正确 - 它们来自字符集 Latin Extended-A 它们的十六进制值不正确(0xBE、0x9A、0xE8、 ...)。预期值为 0x013E、0x0161、0x010D、...

这是怎么做到的?是否有可能或者我应该完全避免使用这些字符?

GetPrivateProfileString 不做任何字符转换。如果调用成功,它会告诉你文件中的内容。

因为你想要有 unicode 字符,你的文件可能是 UTF-8 或 UTF-16。如果您的文件是 UTF-8,您应该能够用 GetPrivateProfileStringA 读取它,但它会给您一个 char 数组,其中将包含正确的 UTF-8 字符(即,不是 0x013E,因为 0x013E 不是 UTF-8)。

如果您的文件是 UTF-16,那么 GetPrivateProfileStringW 应该可以工作,并在 wchar_t 数组中为您提供 UTF-16 代码(0x013E、0x0161、0x010D,...)。

编辑:实际上您的文件是在 Windows-1250 中编码的。这是单字节编码,因此 GetPrivateProfileStringA 工作正常,如果需要,您可以使用 MultiByteToWideChar 和 1250 作为代码页参数将其转换为 UTF-16。