2014-02-12 70 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