我在我的一个项目中使用FreeType2。为了呈现一个字母,我需要提供一个Unicode双字节字符代码。但代码读取的字符代码是ASCII单字节格式。对于低于128的字符代码(字符代码相同),它没有问题,但是其他128不匹配。例如:
ASCII中的'a'是0x61,Unicode中的'a'是0x0061 - 这很好 ASCII中的'±'是0xB9,Unicode中的'±'是0x0105 - 完全不同
我试图在那里使用WinAPI功能,但我必须做错事。这是一个示例:
unsigned char szTest1[] = "ąółź"; //ASCII format
wchar_t* wszTest2;
int size = MultiByteToWideChar(CP_UTF8, 0, (char*)szTest1, 4, NULL, 0);
printf("size = %d\n", size);
wszTest2 = new wchar_t[size];
MultiByteToWideChar(CP_UTF8, 0, (char*)szTest1, 4, wszTest2, size);
printf("HEX: %x\n", wszTest2[0]);
delete[] wszTest2;
我期待创建一个新的宽字符串,最后没有NULL。但是, size 变量总是等于0.任何想法我做错了什么?或者可能有一种更简单的方法来解决问题?
答案 0 :(得分:6)
“纯”ASCII字符集限制在0-127(7位)范围内。具有最高有效位设置的8位字符(即范围128-255中的那些字符)不是唯一定义的:它们的定义取决于代码页。
因此,您的角色ą
( LATIN SMALL LETTER A WITH OGONEK )由特定代码页中的值0xB9
表示,该代码页应为Windows-1250。在其他代码页中,值0xB9
与不同的字符相关联(例如,在Windows 1252 code page中,0xB9
与字符¹
相关联,即上标数字1)。
要使用Windows Win32 API将特定代码页中的字符转换为Unicode UTF-16,您可以使用MultiByteToWideChar
,指定正确的代码页(不 {{1在你的问题的代码中写的;实际上,CP_UTF8
标识Unicode UTF-8)。您可能想尝试将CP_UTF8
(ANSI中欧;中欧(Windows))指定为正确的code page identifier。
如果您可以在代码中访问 ATL ,则可以使用ATL string conversion helper classes之类的便利,例如1250
,其中包含CA2W
)来电, RAII类中的内存分配; e.g:
MultiByteToWideChar(
现在,您应该能够在Unicode API中使用#include <atlconv.h> // ATL String Conversion Helpers
// 'test' is a Unicode UTF-16 string.
// Conversion is done from code-page 1250
// (ANSI Central European; Central European (Windows))
CA2W test("ąółź", 1250);
字符串。
如果您无法访问ATL或想要基于C ++ STL的解决方案,您可能需要考虑以下代码:
test
答案 1 :(得分:5)
CodePage
的{{1}}参数错误。 Utf-8与ASCII不同。您应该使用MultiByteToWideChar
告诉当前系统代码页(与ASCII不同 - 请参阅Unicode, UTF, ASCII, ANSI format differences)
大小最有可能为零,因为您的测试字符串不是有效的Utf-8字符串。
对于几乎所有Win32函数,您可以在函数无法获取详细的错误代码后调用GetLastError(),因此调用它也会为您提供更多详细信息。