苦苦挣扎将vector <char>转换为wstring </char>

时间:2014-02-12 14:32:06

标签: c++ boost utf-8 locale utf-16

我需要将utf16文本转换为utf8。实际的转换代码很简单:

std::wstring in(...);
std::string out = boost::locale::conv::utf_to_utf<char, wchar_t>(in);

但问题是UTF16是从文件中读取的,它可能包含也可能不包含BOM。我的代码需要是可移植的(最小的是windows / osx / linux)。我真的很难弄清楚如何从字节序列中创建wstring

编辑:这不是链接问题的重复,因为在那个问题中OP需要将一个宽字符串转换为一个字节数组 - 我需要转换另一种方式。

1 个答案:

答案 0 :(得分:2)

在你的情况下,根本不应该使用宽类型。

假设您可以从char *获得vector<char>,则可以使用以下代码坚持字节:

char * utf16_buffer = &my_vector_of_chars[0];
char * buffer_end = &my_vector_of_chars[vector.size()];
std::string utf8_str = boost::locale::conv::between(utf16_buffer, buffer_end, "UTF-8", "UTF-16");

between以8位字符运行,允许您完全避免转换为16位字符。

有必要使用指向缓冲区末尾的between重载,因为默认情况下,between将停留在字符串中的第一个'\0'字符处,这将是几乎是立即因为输入是UTF-16。