gpt4 book ai didi

c++ - MSVC (std::codecvt) 上的双字节编码:无法识别前导字节

转载 作者:可可西里 更新时间:2023-11-01 10:26:14 28 4
gpt4 key购买 nike

我想使用 std::codecvt<wchar_t, char, std::mbstate_t>::in() 将以双字节代码页编码的字符串转换为 UTF-16 字符串关于 Microsoft 标准库实现 (MSVC11)。例如,考虑以下程序:

#include <iostream>
#include <locale>

int main()
{
// KATAKANA LETTER A (U+30A2) in Shift-JIS (Codepage 932)
// http://msdn.microsoft.com/en-us/goglobal/cc305152
char const cs[] = "\x83\x41";

std::locale loc = std::locale("Japanese");

// Output: "Japanese_Japan.932" (as expected)
std::cout << loc.name() << '\n';

typedef std::codecvt<wchar_t, char, std::mbstate_t> cvt_t;
cvt_t const& codecvt = std::use_facet<cvt_t>(loc);
wchar_t out = 0;
std::mbstate_t mbst = std::mbstate_t();
char const* mid;
wchar_t* outmid;

// Output: "2" (error) (expected: "0" (ok))
std::cout << codecvt.in(
mbst, cs, cs + 2, mid,
&out, &out + 1, outmid) << '\n';

// Output: "0" (expected: "30a2")
std::cout << std::hex << out << '\n';
}

调试的时候发现in()最终调用内部 _Mbrtowc()函数 (crt\src\xmbtowc.c),传递 std::locale 的内部(C?)部分, 用 {_Page=932 _Mbcurmax=2 _Isclocale=0 ...} 初始化,其中 ... 代表(这似乎是问题所在)_Isleadbyte成员,初始化为 32 个零的数组(类型为 unsigned char)。因此,当函数处理 '\x32' 时前导字节,它检查这个数组并自然地得出(错误的)结论,即这不是一个前导字节。所以它愉快地调用MultiByteToWideChar() Win-API 函数,当然无法转换半角字符。所以,_Mbrtowc()返回错误代码 -1,这或多或少地取消了调用堆栈上的所有内容,最终返回了 2 ( std::codecvt_base::result::error )。

这是 MS 标准库中的错误吗(看起来是这样)? (如何)我可以以一种可移植的方式解决这个问题(即用最少的 #ifdef s)?

最佳答案

我在内部向 Microsoft 报告了它。现在已将其作为一个新错误 (DevDiv#737880)。但我建议在以下位置填写连接项目:http://connect.microsoft.com/VisualStudio

关于c++ - MSVC (std::codecvt) 上的双字节编码:无法识别前导字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17122277/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com