gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:24:11 25 4
gpt4 key购买 nike

我的软件支持多种语言(英语、德语、波兰语、俄语……)。
出于这个原因,我有一些特定语言的文件,其中包含特定语言的对话框文本(编码为 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 中全局设置为 "Language for非 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 header ,您可能还需要删除它。

关于c++ - utf-8(波兰语)无法正常工作的可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49872812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com