c++ - 将 C++ std::string 转换为 UTF-16-LE 编码的字符串

标签 c++ utf-8 character-encoding utf-16 stdstring

我今天搜索了几个小时,就是找不到适合我的东西。我刚刚看过的是“ How to convert UTF-8 encoded std::string to UTF-16 std::string ”。

我的问题是,有一个简短的解释:

我想在标准 C++ 中制作一个有效的 NTLM 散列,我正在使用 OpenSSL 的库使用其 MD4 例程创建散列。我知道该怎么做,所以有人知道如何将 std::string 转换为 UTF-16 LE 编码字符串,我可以将其传递给 MD4 函数以获得正确的摘要吗?

那么,我能否拥有一个包含 char 类型的 std::string,并将其转换为 UTF16-LE 编码的可变长度 std::string_type?是 std::u16string 还是 std::wstring

我会使用 s.c_str() 还是 s.data() 并且 length() 函数会在两者中正确报告案例?

最佳答案

我认为像这样的东西应该可以解决问题:

std::string utf16_to_utf8(std::u16string const& s)
{
    std::wstring_convert<std::codecvt_utf8_utf16<char16_t, 0x10ffff,
        std::codecvt_mode::little_endian>, char16_t> cnv;
    std::string utf8 = cnv.to_bytes(s);
    if(cnv.converted() < s.size())
        throw std::runtime_error("incomplete conversion");
    return utf8;
}

std::u16string utf8_to_utf16(std::string const& utf8)
{
    std::wstring_convert<std::codecvt_utf8_utf16<char16_t, 0x10ffff,
        std::codecvt_mode::little_endian>, char16_t> cnv;
    std::u16string s = cnv.from_bytes(utf8);
    if(cnv.converted() < utf8.size())
        throw std::runtime_error("incomplete conversion");
    return s;
}

注意: std::wstring_convertC++17 中被弃用,但我仍然喜欢使用它而不是非标准库,因为它是可移植的,没有依赖性并且毫无疑问会一直保留到被替换为止。

而且,如果所有其他方法都失败了,您可以使用替代代码重新实现这些相同的功能,而无需更改应用程序的任何其他部分。

关于c++ - 将 C++ std::string 转换为 UTF-16-LE 编码的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52703630/

相关文章:

python - 当发送带有 UTF-8 字符的附件时,Flask 会引发 UnicodeEncodeError (latin-1)

mysql - UTF-8字符有问题;我看到的不是我存储的

java - 向api提交数据时的GSM扩展字符编码问题

c++ - 如何在 C++ 中使用类修改器将变量加倍

c++ - 对 Class::Class() 和 Class::function() 的 undefined reference

mysql - 使用 Coldfusion 显示来自 mysql 的俄语数据

php - 字符编码错误,无法通过 PHP 从 MySQL 写入有效的 XML

c++ - 运行函数时出错

c++ - 为什么复制构造函数被调用了 25 次,而插入循环只迭代了 10 次?

java - URL 解码 ä -> ã1⁄4