正如man 3p mbrtowc
所说,它可能返回四种结果类型:0
如果字节将被解码为NUL宽字符,(size_t)-2
如果序列被截断,(size_t)-1
如果序列是非法的,以及其他值从零到多字节序列的长度。这里的一切都足够清楚。 WinAPI呢?
有一个MultiByteToWideChar
函数,可以设置ERROR_NO_UNICODE_TRANSLATION
(与(size_t)-1
对应于mbrtowc
),ERROR_INVALID_FLAGS
和ERROR_INVALID_PARAMETER
(我认为与EINVAL
相同)。我对ERROR_INSUFFICIENT_BUFFER
表示怀疑:对于(size_t)-2
来说,它可能与mbrtowc
含义相同,但是从文档中看来,这仅意味着宽字符的缓冲区不足以存储转换后的字符。
在没有重新实现mbrtowc
和朋友的情况下检索此类功能(如果可能)的常用做法是什么?是否有MultiByteToWideChar
替代方案,在Windows中可以作为mbrtowc
使用?提前致谢!
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()可能也没有您想要的错误处理程度。 Microsoft涵盖了许多细节。如果您需要真正精确的语义,则可能需要使用独立的库(例如IBM的ICU),它将为您提供所需的所有内容。
这全都取决于您要解决问题的精确度。