- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如 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
含义相同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/
我在 Visual Studio 9.0 上有一个 Visual C++ 应用程序。我们已经使用“Unicode character Set”作为 Character Set 构建了应用程序。我们正在
我有像这样使用 MultiByteToWideChar 的代码: wchar_t * bufferW = malloc(mbBufferLen * 2); MultiByteToWideChar(CP
我正在使用 MultiByteToWideChar 将我的字符串转换为 wstring。我首先尝试为我的 wstring 获取所需的大小。根据将 0 作为最后一个参数传递的文档应该可以完成此操作。使用
以下代码打印了所需的输出,但它在字符串末尾打印了乱码。最后一次调用 MultiByteToWideChar 有问题,但我不知道是什么。请帮忙?? #include "stdafx.h" #includ
此韩语文本(可打印引用)“2013-03-22 =0E?@HD=0F 05:30”无法通过 MultiByteToWideChar 正确转换为 Unicode。 Quoted-printable fo
我正在 std::string 上构建一个合成的 UTF-8 字符串,并尝试使用 MultiByteToWideChar 对其进行转换。这是我的代码: std::string str; str +=
我想将普通的string 转换为wstring。为此,我尝试使用 Windows API 函数 MultiByteToWideChar .但这对我不起作用。 这是我所做的: string x = "T
正如 man 3p mbrtowc 所说,它可能返回四种结果类型:0(如果字节将被解码为 NUL 宽字符) , (size_t)-2 如果序列被截断,(size_t)-1 如果序列非法,以及从零到多字
这是函数: char *ToLowerSTR(/*char*/ WCHAR* buffer) // NEED TO FIX UNRESOLVED EXTERNAL { CHAR* str;
前几天在开发程序时,我必须将 ASCII 字符串转换为 Unicode 字符串。顺便说一句,我正在使用 Visual Studio 2012 在 Windows 上工作。我注意到 Win32 函数 M
我有一个 Excel VBA 项目,我正在适应 64 位 Office。一方面,我调用 MultiByteToWideChar()使用 20 个左右不同的代码页中的任何一个。 (所以 StrConv
我想从 UTF-8 文件中读取一小行并将其显示在 Windows 控制台中。 我使用 MultiByteToWideChar Winapi 函数成功了: void mbtowchar(const ch
我有一个使用 MultiByteToWideChar 将 UTF-8 字符串转换为 UTF-16 的 C++ 代码片段 对于 C++,如果输入是“Hã´tel”,则输出是“Hôtel”,这是正确的 对
我想要一个将字符串转换为具有两种不同行为的宽字符串的选项: 忽略非法字符 如果出现非法字符则中止转换: 在 Windows XP 上我可以这样做: bool ignore_illegal; // in
使用 std::wstring 就像我使用 MultiByteToWideChar 一样? std::wstring widen(const std::string &in) { int le
我正在尝试编写一个可以在 EditControl 中打开和显示 ANSI 和 Unicode 的通用文本编辑器。如果我确定文本是 ANSI,是否需要重复调用 ReadFile()?无法弄清楚如何执
我正在使用一个包装 std::wstring 的类,此代码需要跨平台,是否有 Windows 函数的等价物:Linux 上的 MultiByteToWideChar 和 WideCharToMulti
使用 Win32 API MultiByteToWideChar() 从 Unicode UTF-8 转换为 Unicode UTF-16 时,是否应该使用 MB_ERR_INVALID_CHARS
我有一个函数可以将字符串从各种编码转换为 Windows 内部使用的 Unicode-16。为此,我使用了 MultiByteToWideChar应用程序接口(interface)。但我刚刚发现以下内
我是一名优秀的程序员,十分优秀!