Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio 2015中的双字节字符序列转换问题 我试图用C++语言将CP936中的双字节字符序列(DCS)转换为 WCARGYT。代码如下: #include <iostream> #include <locale> #include <codecvt> // 国 in CP936 char const src[] = "\xB9\xFA"; int main() { std::locale loc(".936"); typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type; codecvt_type const & cvt = std::use_facet<codecvt_type>(loc); std::mbstate_t state; std::memset(&state, 0, sizeof(state)); char const * src_mid = src; wchar_t buf[10]; wchar_t * buf_mid = buf; std::codecvt_base::result res = cvt.in(state, src, src + 2, src_mid, buf, buf + 10, buf_mid); int eno = errno; std::cout << "res: " << +res << "\n" << "errno: " << eno << "\n"; return 0; }_C++_Visual Studio_Character Encoding_Visual Studio 2015_Locale - Fatal编程技术网

Visual Studio 2015中的双字节字符序列转换问题 我试图用C++语言将CP936中的双字节字符序列(DCS)转换为 WCARGYT。代码如下: #include <iostream> #include <locale> #include <codecvt> // 国 in CP936 char const src[] = "\xB9\xFA"; int main() { std::locale loc(".936"); typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type; codecvt_type const & cvt = std::use_facet<codecvt_type>(loc); std::mbstate_t state; std::memset(&state, 0, sizeof(state)); char const * src_mid = src; wchar_t buf[10]; wchar_t * buf_mid = buf; std::codecvt_base::result res = cvt.in(state, src, src + 2, src_mid, buf, buf + 10, buf_mid); int eno = errno; std::cout << "res: " << +res << "\n" << "errno: " << eno << "\n"; return 0; }

Visual Studio 2015中的双字节字符序列转换问题 我试图用C++语言将CP936中的双字节字符序列(DCS)转换为 WCARGYT。代码如下: #include <iostream> #include <locale> #include <codecvt> // 国 in CP936 char const src[] = "\xB9\xFA"; int main() { std::locale loc(".936"); typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type; codecvt_type const & cvt = std::use_facet<codecvt_type>(loc); std::mbstate_t state; std::memset(&state, 0, sizeof(state)); char const * src_mid = src; wchar_t buf[10]; wchar_t * buf_mid = buf; std::codecvt_base::result res = cvt.in(state, src, src + 2, src_mid, buf, buf + 10, buf_mid); int eno = errno; std::cout << "res: " << +res << "\n" << "errno: " << eno << "\n"; return 0; },c++,visual-studio,character-encoding,visual-studio-2015,locale,C++,Visual Studio,Character Encoding,Visual Studio 2015,Locale,尽管源字符串AFAIK包含正确的前导字节和尾随字节,但从未执行此分支。我在调试器中检查了\u Isleadbyte数组,它都是零。因此,这个将输入长度设置为2的分支永远不会执行,而是执行将长度设置为1的分支,因此MultiByteToWideChar()会失败,因为前导字节必须伴随尾随字节 我甚至检查了c936.NLS是否存在于C:\Windows\System32\中,因此这应该不是问题所在 所以,我想问题是:这个问题是不是在我这边,测试代码,Windows操作系统设置,缺少组件?或者这是Vi

尽管源字符串AFAIK包含正确的前导字节和尾随字节,但从未执行此分支。我在调试器中检查了
\u Isleadbyte
数组,它都是零。因此,这个将输入长度设置为
2
的分支永远不会执行,而是执行将长度设置为
1
的分支,因此
MultiByteToWideChar()
会失败,因为前导字节必须伴随尾随字节

我甚至检查了
c936.NLS
是否存在于
C:\Windows\System32\
中,因此这应该不是问题所在

所以,我想问题是:这个问题是不是在我这边,测试代码,Windows操作系统设置,缺少组件?或者这是Visual Studio 2015代码中的问题

更新

所以我偶然发现了这个问题:

OPs自己的答案显示了一种解决方法:

const int oldMbcp = _getmbcp();
_setmbcp(932);
const std::locale locale("Japanese_Japan.932");
_setmbcp(oldMbcp);
我尝试使用的CP936似乎也采用了相同的解决方法

更新2


我向微软提交了一份文件。

MultiByteToWideChar(936,0,src,-1,buf,10);BAM,完成了,没有问题。@ HSPSPANTAN:好,我不想使用这个函数,但C++区域设施。
const int oldMbcp = _getmbcp();
_setmbcp(932);
const std::locale locale("Japanese_Japan.932");
_setmbcp(oldMbcp);