我们如何找到角色是否属于特定代码页? 或者我们如何确定字符是否适合应用程序的当前活动IME。
答案 0 :(得分:2)
使用WC_ERR_INVALID_CHARS
标志,如果使用任何无效字符,WideCharToMultiByte将彻底失败。如果您想知道目标代码页中没有表示哪些字符,请使用lpDefaultChar和lpUsedDefaultChar参数。
LPCWSTR pszUtf16; // converted from utf8 source character
UINT nTargetCP = CP_ACP;
BOOL fBadCharacter = FALSE;
if(WideCharToMultiByte(nTargetCP,WC_NO_BEST_FIT_CHARS,pszUtf16,NULL,0,NULL,&fBadCharacter)
{
if(fBadCharacter)
{
// at least one character in the string was not represented in nTargetCP
}
}
答案 1 :(得分:2)
之前的两个答案已正确建议使用MultiByteToWideChar然后使用WideCharToMultiByte将您的UTF-8字符转换为UTF-16,然后转换为当前的Windows代码页(CP_ACP)。检查WideCharToMultiByte的结果以查看转换是否成功。
原始问题不清楚的是,你与印地语有特殊的问题。对于这种语言,你的问题毫无意义,因为没有印地语的Windows ANSI代码页,正如Chris Becke指出的那样。因此,您永远不能将印地语字符转换为CP_ACP,并且WideCharToMultiByte将始终失败。
要在Windows上使用印地语,据我所知,您必须是一个调用Unicode API的Unicode应用程序。
答案 2 :(得分:0)
使用Windows函数WideCharToMultiByte和MultiByteToWideChar,您可以在UTF-8和16位Unicode字符之间进行转换。这些函数具有指定代码页的参数,并在遇到无效字符时指定行为。
答案 3 :(得分:0)
谢谢Chris ..我正在运行以下代码
#define CP_HINDI 0
#define CP_JAPANESE 932
#define CP_ENGLISH 1252
wchar_t wcsStringJapanese = 'あ';
wchar_t wcsStringHindi = 'र';
wchar_t wcsStringEnglish = 'A';
int main()
{
BOOL usedDefaultCharacter = FALSE;
/* Test for ENGLISH */
WideCharToMultiByte( CP_ENGLISH,
0, &wcsStringEnglish,
-1,
NULL,
0,
NULL,
&usedDefaultCharacter);
printf("usedDefaultCharacters for English? %d \n",usedDefaultCharacter);
usedDefaultCharacter = FALSE;
/*TEST FOR JAPANESE */
WideCharToMultiByte( CP_JAPANESE,
0,
&wcsStringJapanese,
-1,
NULL,
0,
NULL,
&usedDefaultCharacter);
printf("usedDefaultCharacters for Japanese? %d \n",usedDefaultCharacter);
//TEST FOR HINDI
usedDefaultCharacter = FALSE;
WideCharToMultiByte( CP_HINDI,
0,
&wcsStringHindi,
-1,
NULL,
0,
NULL,
&usedDefaultCharacter);
printf("usedDefaultCharacters for Hindi? %d \n",usedDefaultCharacter);
}
上面的代码返回:
usedDefaultCharacters为英语? 0
日语使用的默认字符? 0
用于印地语的默认字符? 1
第三行不正确,因为印地语的代码页为0,并且传递的字符串由印地语字符组成,而且仍然将usedDefaultChar设置为1 ..这不应该是这种情况。