繁体   English   中英

无法将字符数组转换为具有utf-8字符的wstring

[英]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;
}

示例:当我将转换后的值打印到MessageBox中时,Grüßen显示为Gr ?? en

我正在使用此转换后的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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM