gpt4 book ai didi

c++ - Vista 上的 MultiByteToWideChar API 更改

转载 作者:搜寻专家 更新时间:2023-10-31 01:59:04 26 4
gpt4 key购买 nike

我想要一个将字符串转换为具有两种不同行为的宽字符串的选项:

  1. 忽略非法字符
  2. 如果出现非法字符则中止转换:

在 Windows XP 上我可以这样做:

bool ignore_illegal; // input

DWORD flags = ignore_illegal ? 0 : MB_ERR_INVALID_CHARS;

SetLastError(0);

int res = MultiByteToWideChar(CP_UTF8,flags,"test\xFF\xFF test",-1,buf,sizeof(buf));
int err = GetLastError();

std::cout << "result = " << res << " get last error = " << err;

现在,如果 ignore illegal is true characters 在 XP 上,我会得到:

result = 10 get last error = 0

如果 ignore illegal 是假的,我得到

result = 0 get last error = 1113 // invalid code

所以,给定足够大的缓冲区就足以检查结果!= 0 ;

根据文档 http://msdn.microsoft.com/en-us/library/dd319072(VS.85).aspxAPI 发生了变化,那么这在 Vista 上有何变化?

最佳答案

我认为它的作用是按照 Unicode 标准的规定,用替换字符 (U+FFFD) 替换非法代码单元。以下代码

#define STRICT
#define UNICODE
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN

#include <windows.h>

#include <cstdlib>
#include <iostream>
#include <iomanip>


void test(bool ignore_illegal) {
const DWORD flags = ignore_illegal ? 0 : MB_ERR_INVALID_CHARS;
WCHAR buf[0x100];
SetLastError(0);
const int res = MultiByteToWideChar(CP_UTF8, flags, "test\xFF\xFF test", -1, buf, sizeof buf);
const DWORD err = GetLastError();
std::cout << "ignore_illegal = " << std::boolalpha << ignore_illegal
<< ", result = " << std::dec << res
<< ", last error = " << err
<< ", fifth code unit = " << std::hex << static_cast<unsigned int>(buf[5])
<< std::endl;
}


int main() {
test(false);
test(true);
std::system("pause");
}

在我的 Windows 7 系统上产生以下输出:

ignore_illegal = false, result = 0, last error = 1113, fifth code unit = fffd
ignore_illegal = true, result = 12, last error = 0, fifth code unit = fffd

因此错误代码保持不变,但长度相差了两个,表示已插入两个替换代码点。如果你在 XP 上运行我的代码,如果两个非法代码单元被删除,第五个代码点应该是 U+0020(空格字符)。

关于c++ - Vista 上的 MultiByteToWideChar API 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3447183/

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