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

时间:2015-01-05 12:57:22

标签: c++ winapi unicode character ini

我面临一个小问题。我来自使用语言扩展字符集的国家(特别是拉丁语扩展-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 。它们的hexa值是正确的(0xFD,0xE1,0xED,......)。

字符ľ,š,č,ť,ž被错误地加入 - 它们来自字符集 Latin Extended-A 它们的hexa值不正确(0xBE,0x9A,0xE8,...)。预期值为0x013E,0x0161,0x010D,......

怎么可能这样呢?是否有可能或者我应该避免这些角色?

1 个答案:

答案 0 :(得分:4)

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。