2014-02-12 31 views
2

我需要将utf16文本转换为utf8。实际的转换代码很简单:努力将矢量<char>转换为wstring

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

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

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

+0

我不确定,会[此帖](https://stackoverflow.com/questions/2573834/c-convert-string-or-char-to-wstring-or-wchar-t)有帮助吗? – gongzhitaao

+0

如何将'vector '转换为'wstring'? – SirDarius

+0

@SirDarius嗯,这正是我的问题:如何从'vector '获取'wstring'? –

回答

2

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

假设你可以从你的vector<char>得到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将在第一'\0'字符串中,这将是几乎立即因为输入是UTF-16停止between过载。

+0

恩,有趣的想法。我会试一试并回复。 –

+0

这几乎可行。由于字符串也包含拉丁字符(即向量中有\ 0字节),所以我必须明确指定结束指针:'boost :: local :: conv :: between(&my_vector_of_chars [0],&my_vector_of_chars [vector。 (UTF-8),“UTF-16”) –

+0

Ouch,当然是有道理的,因为在我的答案中使用的形式将会有零个字符并且没​​有结束指针,它肯定会失败,因为之间会停在第一个空字符,要解决这个问题。 – SirDarius