Win1251->UTF16转换

Posted

技术标签:

【中文标题】Win1251->UTF16转换【英文标题】:Win1251->UTF16 conversion 【发布时间】:2010-11-24 12:26:53 【问题描述】:

我有一个用 Windows-1251 编码编写的 dll 项目,我需要用 UTF-16 编码的 dll 输出。我使用以下函数进行转换:

ptr = MultiByteToWideChar(CP_ACP, 0, str, -1, wbuff.getBuffer(), len);

不幸的是,MultiByteToWideChar 使用系统语言环境作为源编码。因此,例如,如果我的 Windows 语言环境是英语(美国),它会根据需要转换 Win1252->UTF8,而不是 Win1251->UTF8。

我尝试手动设置语言环境,但以下代码也不起作用:

enc = setlocale(CL_ALL, "rus_rus.1251");
//this returns Windows-1251 encoding
ptr = MultiByteToWideChar(CP_ACP, 0, str, -1, wbuff.getBuffer(), len);

据我了解,MultiByteToWideChar 始终使用系统区域设置,而忽略我的 setlocale 调用。

还有其他方法可以进行这种转换吗?或者我可能只是不正确理解这些语言环境设置?谢谢。

附:对于语法错误,我深表歉意。

【问题讨论】:

【参考方案1】:

setlocale 是一个 CRT 函数。显然 Windows API 并不关心通过它设置了什么。

您应该设置所需的代码页(在您的情况下为 1251)而不是 CP_ACP(这意味着系统默认值)。

res = MultiByteToWideChar(1251, 0, str, -1, wbuff.getBuffer(), len);

【讨论】:

【参考方案2】:

如果您没有被强制使用 WinAPI,您可能想要使用ICU's character converter。

【讨论】:

以上是关于Win1251->UTF16转换的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu上的库ICU不希望从Unicode转换为windows-1251

如何使用 XML/SGML 实体将 UTF-16 转换为 ASCII/ANSI?

C++11 字符转换 UTF-8 UTF-16 UTF-32 UNICODE 错误LINK2001

javascript转换hex到UTF16 再将utf16转换到utf8

在java中将UTF-16 unicode字符转换为UTF-8

将XML转换为Json(标记为UTF-16但具有UTF-8内容的文档)