无法将字符数组转换为包含 utf-8 字符的字符串
Cannot convert character array to wstring with utf-8 characters
当我尝试在Visual C++中使用以下函数将char*转换为wstring时。该函数能够转换普通英语语言的字符串,但是当我使用其他语言的字符时,它不会转换所有字符。
std::wstring s2ws(const char* utf8Bytes)
{
const std::string& str(utf8Bytes);
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
例: 当我将转换后的值打印到消息框中时,Grüßen 显示为 Gr??zh
我正在使用这个转换后的 wstring 来获取我的目录的内容,如下所示:
map<wstring, wstring> getAllFiles(wstring folder, wstring filter) {
wstring directory = folder + L"/" + filter;
WCHAR szBuf[MAX_PATH];
WIN32_FIND_DATA d;
HANDLE hFindFile = FindFirstFile(directory.c_str(), &d);
.....
}
在这里,我没有得到预期的输出。 即目录的内容。但是当utf8bytes数组是普通的英文字符时得到它。
我认为您应该将代码更改为以下内容:
std::wstring s2ws(const char* utf8Bytes)
{
const std::string& str(utf8Bytes);
int size_needed = MultiByteToWideChar(CP_ACP, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_ACP, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
此处列出了两个标志之间的区别。
我认为您的代码正在做正确的事情,问题一定出在您的 UTF-8 字符串上。如果我像这样调用您的代码,它会按预期工作:
char utf8buffer[1024];
WideCharToMultiByte(
CP_UTF8,
WC_ERR_INVALID_CHARS,
L"Grüßen",
-1,
utf8buffer,
1024,
nullptr,
false
);
assert(s2ws(utf8buffer) == L"Grüßen");
相关文章:
- HEX值到wchar_t字符(UTF-8)的转换
- 转换特殊字符(UTF-8)
- 在C++中使用 UTF-8 字符串和字符
- 在基于英语的系统上将 UTF-8 路径转换为宽字符会引发异常
- 无法将字符数组转换为包含 utf-8 字符的字符串
- 如何在 Visual C++ 中使用 UTF-8 字符串作为字符*?
- 读取UTF-8文件需要解析字符
- 如何正确处理渲染大小为 >= 2B 的 utf-8 字符?
- C++ UTF-8 瑞典语字符读取为 ASCII
- 如何C++ WCOUT UTF-16 编码的字符数组?
- 检查 UTF-8 是wchar_t还是字符?
- Qt UTF-8 文件到 std::string 添加额外的字符
- 字符的 UTF-8 转换
- C Unicode UTF-8解码字符的问题
- 将转义的 UTF-8 八位字节的字符数组转换为 C++ 的字符串
- 如何在没有wchar_t的情况下在 c++ 中解码/编码 UTF-8 字符
- 如何将 utf 字符转换为 windows-1252?
- 在 Linux 中将 UTF-32 宽字符转换为 UTF-16 宽字符以获取补充平面字符
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- 从键盘读取 UTF-8 编码的字符