将C++ std::string 转换为 UTF-16-LE 编码的字符串
Convert C++ std::string to UTF-16-LE encoded string
我今天已经搜索了几个小时,只是找不到任何适合我的东西。 我刚刚看过的,没有运气,是">如何将 UTF-8 编码的 std::string 转换为 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_convert 在C++17
中已弃用,但我仍然倾向于使用它而不是非标准库,因为它是可移植的,没有依赖项,并且无疑会保留直到被替换。
而且,如果所有其他方法都失败了,您可以使用替代代码重新实现这些相同的功能,而无需更改应用程序的任何其他部分。
道歉,第一手资料...这将是一个带有一些长代码的丑陋回复。我最终使用以下函数,同时有效地将iconv
编译到我的 Windows 应用程序文件中:)
希望这有帮助。
char* conver(const char* in, size_t in_len, size_t* used_len)
{
const int CC_MUL = 2; // 16 bit
setlocale(LC_ALL, "");
char* t1 = setlocale(LC_CTYPE, "");
char* locn = (char*)calloc(strlen(t1) + 1, sizeof(char));
if(locn == NULL)
{
return 0;
}
strcpy(locn, t1);
const char* enc = strchr(locn, '.') + 1;
#if _WINDOWS
std::string win = "WINDOWS-";
win += enc;
enc = win.c_str();
#endif
iconv_t foo = iconv_open("UTF-16LE", enc);
if(foo == (void*)-1)
{
if (errno == EINVAL)
{
fprintf(stderr, "Conversion from %s is not supportedn", enc);
}
else
{
fprintf(stderr, "Initialization failure:n");
}
free(locn);
return 0;
}
size_t out_len = CC_MUL * in_len;
size_t saved_in_len = in_len;
iconv(foo, NULL, NULL, NULL, NULL);
char* converted = (char*)calloc(out_len, sizeof(char));
char *converted_start = converted;
char* t = const_cast<char*>(in);
int ret = iconv(foo,
&t,
&in_len,
&converted,
&out_len);
iconv_close(foo);
*used_len = CC_MUL * saved_in_len - out_len;
if(ret == -1)
{
switch(errno)
{
case EILSEQ:
fprintf(stderr, "EILSEQn");
break;
case EINVAL:
fprintf(stderr, "EINVALn");
break;
}
perror("iconv");
free(locn);
return 0;
}
else
{
free(locn);
return converted_start;
}
}
相关文章:
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 从/到 UTF-8/UTF-16 的转换需要(例如:utf8 -> 代码点,然后代码点到 utf16)或(例如:utf8 -> utf16)?
- 通过分隔符分隔包含 UTF-16 BE 文本的uint8_t数组
- PostgreSQL C++ libpq 编码 UTF-8 问题
- 如何从Little Endian UTF-16编码字节中获取C++std::string
- C++ UTF-8/ASCII to UTF-16 in MFC
- 如何C++ WCOUT UTF-16 编码的字符数组?
- 在这种情况下,UTF-16 和 UTF-32 的 BOM 是强制性的
- 查找十六进制字符串是 utf-8 或 utf-16
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- Windows的unicode数据类型使用什么unicode编码(UTF-8、UTF-16等)
- 为什么我不能在窗口上使用 boost::locale::conv::between 将 UTF-16 文本转换为其他编码
- 字符类型并将 ASCII 文本重新编码为 UTF-16
- 如何将 UTF-8 编码的 std::string 转换为 UTF-16 std::string
- linux ascii到utf-16(然后是sha1和base64)编码
- 为什么使用中文代码页集的Windows控制台可以显示UTF-16编码的字符
- c++是否支持除UTF-8、UTF-16和UTF-32以外的字符编码之间的转换?
- 如何将std::string中包含utf-16编码的文本转换为utf-16 wstring
- c++中utf -16编码文本的截断读取
- 什么是用于 UTF-8/UTF-16 文本编码C++小型 LGPL 库?