其他分享
首页 > 其他分享> > c-uft-8(波兰语)的可视化无法正常工作

c-uft-8(波兰语)的可视化无法正常工作

作者:互联网

我的软件支持多种语言(英语,德语,波兰语,俄语等).因此,我有一些特定于语言的文件,其中包含特定语言的对话文本(编码为UTF-8).
在我的mfc应用程序中,我打开并阅读这些文件,然后将文本插入AfxMessageBoxes和其他UI-Windows.

// Get the codepage number. 65001 = UTF-8
// In the real code this is a parameter in the function I call (just for clarification)
LANGID languageID = 65001;
TCHAR szCodepage[10];
GetLocaleInfo (MAKELCID (languageID, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, szCodepage, 10);
int nAnsiCodePage = _ttoi (szCodepage);

// Open the file
CFile file;
CString filename = getName();

if (!file.Open(FileName, CFile::modeRead, NULL))
{
    //Check if everything is fine, else break
}

// Read the file
CString inString;
int len = file.GetLength ();
UINT n = file.Read (inString.GetBuffer(len), len);
inString.ReleaseBuffer ();
int size = MultiByteToWideChar (CP_ACP, 0, strAllItems, -1, NULL, 0);

WCHAR *ubuf = new WCHAR[size + 1]; 
MultiByteToWideChar ((UINT) nAnsiCodePage, (nAnsiCodePage == CP_UTF8 ?
                                     0 : MB_PRECOMPOSED), inString, -1, ubuf, (int) size);

outString = ubuf;
file.Close ();

结果:

Result

此机制对俄语和德语的特殊字母有效,但对波兰语无效.我已经检查了utf-8网站(http://www.utf8-chartable.de/unicode-utf8-table.pl?number=1024),并且其中的波兰语字符也包含在内.
我还检查了我的CString的十六进制值,一切似乎都还不错,但是没有以正确的方式显示出来.仅出于测试目的,我将使用的代码页从utf-8更改为1250(包括东欧在内的波兰语),但它也无法正常工作.
我究竟做错了什么?

编辑:
当我使用时:

MultiByteToWideChar (CP_UTF8 , 0, inString, -1, ubuf, (int) size);

十六进制值缩短为“最佳匹配”字母.意思是我的结果是:mezczyzna

我正在使用Windows 7和所选的英语.

解决方法:

好吧,您有两种选择:

答:使您的应用程序Unicode.您没有告诉我们它是否确实存在,但我认为不是.从技术上讲,这是“最佳”解决方案,但可能需要付出很多努力,甚至根本不可行(例如,使用非Unicode库).

B.如果您的应用程序不是Unicode,则有一些限制:
-您的应用程序只能使用非unicode API&正确显示一个代码页.消息,遗憾的是无法针对每个应用程序进行设置,它在Windows中使用“非Unicode程序的语言”选项进行了全局设置,并且需要重新启动.
-要正确显示包含默认代码页中未包含的字符的字符串,您需要将其转换为Unicode并使用“宽”版本的API和显式显示消息(例如MessageBoxW()).如果该操作仅涉及少量控件,则有点麻烦但可行.

您正在使用的计算机具有一些西欧语言,即“非Unicode程序的语言”,我之所以得出这个结论,是因为“此机制对俄语和德语的特殊字母有效,并且使用MessageBoxA(0 ,“mę” czyzna“,0,0)不起作用”,正如您所说(尽管我完全不确定俄语,因为它是不同的代码页).

除此之外,正如IInspectable所说,int size = MultiByteToWideChar(CP_ACP,0,strAllItems,-1,NULL,0);完全没有意义,因为该字符串已知为UTF-8,而不是默认代码页.如果文件包含UTF-8 BOM标头,则可能还需要删除它.

标签:c,utf-8,mfc,multilingual,polish
来源: https://codeday.me/bug/20191013/1907941.html