如何从 UTF-8 char * 切换到使用 Win32 API 的动态编码?

How do I switch from UTF-8 char * to a dynamic encoding with Win32 API?

我目前正在开发一个在 Node.js 中使用 Hunspell 的项目。目标是跨平台拼写检查,正确编码 (node-spellchecker)。

我必须使用具有不同编码的任意词典。大多数在 *.aff 文件中有 SET UTF-8,但其他词典有像 SET ISO8859-1 这样的编码。我从 Node 获得 UTF-8,但我需要将其转换为字典的编码。然后,我需要将其反向转换以处理建议。

使用 Linux,我可以使用 iconv 来转换它,但我在 Windows 方面没有那个。但是,我不想要求 UTF-8 字典(有效)。

任何关于从哪里开始的建议或提示将不胜感激。 WideCharToMultiByte 用于一步,但我找不到我期望的 MultiByteToMultiByte

我有的东西

const char *from_encoding_name = "UTF-8"; // This can be swapped
const char *to_encoding_name = "ISO8859-1"; // This can be swapped
const char *word = /* möchtzn encoded in UTF-8 */;

我想要的东西

const char *dictionaryWord = /* möchtzn encoded in ISO-8859-1 */;

谢谢。

我认为 WinAPI 中不存在模拟 MultiByteToMultiByte。我会使用两个调用:MultiByteToWideCharWideCharToMultiByte

顺便说一句,我查看了 .Net 方法的来源 Encoding.Convert,也有通过 UTF-16 完成的转换。

仅供参考,iconv.exe 可用于 Windows,您只需手动安装即可。或者您可以直接将 libiconv 嵌入到您的项目中。

也就是说,您所要求的可以使用 Microsoft API 完成:

  1. Win32 MultiByteToWideChar() and WideCharToMultiByte() 函数。首先使用 MultiByteToWideChar(CP_UTF8) 将 UTF-8 输入解码为 UTF-16,然后使用 WideCharToMultiByte(28591)(或您需要的任何目标代码页)将 UTF-16 编码为 ISO-8859-1。然后在返回时交换代码页。

  2. IMultiLanguage::ConvertString() method, or the IMultiLanguage::CreateConvertCharset() and IMLangConvertCharset::DoConversion() 方法。这些可以将输入从一个代码页直接转换为另一个代码页。

您可以使用其中任何一个来实现您自己的 MultiByteToMultiByte() 包装函数。