c - MultiByteToWideChar 作为 mbrtowc

标签 c winapi encoding

正如 man 3p mbrtowc 所说,它可能返回四种结果类型:0(如果字节将被解码为 NUL 宽字符) , (size_t)-2 如果序列被截断,(size_t)-1 如果序列非法,以及从零到多字节序列长度的其他值。这里一切都足够清楚了。 WinAPI 怎么样?

有一个MultiByteToWideChar函数,它可以设置ERROR_NO_UNICODE_TRANSLATION(对应于(size_t)-1 对于 mbrtowc),ERROR_INVALID_FLAGSERROR_INVALID_PARAMETER(我认为这与 EINVAL 相同)。我对ERROR_INSUFFICIENT_BUFFER表示怀疑:它可能(size_t)-2含义相同em> 为 mbrtowc,但从文档来看,这似乎只是意味着宽字符缓冲区不够大,无法存储转换后的字符。

在不重新实现 mbrtowc 和类似功能的情况下检索此类功能(如果可能的话)的常见做法是什么?是否有在 Windows 中与 mbrtowc 一样工作的 MultiByteToWideChar 替代方案?提前致谢!

P。 S. 请不要建议在这里使用UTF-8。我已经在所有可能的地方使用它。但是,我必须处理 Windows 代码页,现在我正在寻找一种将多字节字符串转换为宽字符序列,然后转换为 Unicode 字形数组的好方法(取决于 sizeof(wchar_t),这意味着直接首先转换为 UTF-32 或从 UTF-16 解码)。我想知道是否由于非法多字节序列而必须停止转换,或者由于给定的多字节序列不完整而可以继续转换。因此,请不要问我为什么也使用 wchar_t:在将代码转换为 UTF-8 或 UTF-32 之前,我确实必须处理代码某些部分的代码页,所以这不是我自己的选择。

最佳答案

假设您正在谈论 Microsoft 的 Windows CRT,那么调用 MultiByteToWideChar() 设置 EILSEQ 并返回 -1 时出现错误将是唯一​​的结果。 Microsoft SDK 源代码是公开可用的(无论如何,其中大部分),我建议简要研究它以澄清情况。

为了回答您问题中的“常见做法”部分,我将针对我现在的公司进行回答。对于我们需要获得精确和语义的情况,C 库总是让您失望,通常是通过分类错误(如本例)或存在错误,或者只是没有与您的代码相同程度的错误处理质量。因此,我们直接从具有我们想要的语义的包装器中调用 MultiByteToWideChar()。

根据您想要达到的疯狂程度,即使 MultiByteToWideChar() 也可能无法达到您想要的错误处理程度。微软掩盖了很多细节。如果您需要真正精确的语义,您可能需要使用独立的库,例如 IBM 的 ICU,它将为您提供可能需要的所有内容。

这一切都取决于您处理问题时想要达到的精确程度。

关于c - MultiByteToWideChar 作为 mbrtowc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27159854/

相关文章:

c - 在 SDL2 C 中使用 for 循环显示矩形

php -\w 取决于编码?

encoding - 在 Cloudfront 上接受编码 header 服务来自 Heroku Cedar 上 Rails 3.0.x 的 Assets

c++ - Windows Netapi32

c - 在 do-while 循环中确定用户输入的变量是否为质数

c - 在 C 中使用指针打印数组的值

c++ - 有没有办法查询消息过滤器是否已经生效?

c++ - SetupDiEnumDeviceInterfaces 显示错误 259

c++ - WinINet API 可以在 Windows Server 操作系统上使用吗?

python-3.x - python 3.4 : str : AttributeError: 'str' object has no attribute 'decode