2010-06-04 15 views
11

如何編寫std :: codecvt方面?我想寫一些從UTF-16到UTF-8,從UTF-16到系統當前代碼頁(windows,所以CP_ACP),以及系統的OEM代碼頁(windows,所以CP_OEM)。如何編寫std :: codecvt方面?

跨平臺是首選,但Windows上的MSVC也不錯。是否有任何類型的教程或任何有關如何正確使用此類的性質?

+0

你可以看一看[中的例子libstdC++手冊](http://gcc.gnu.org/onlinedocs/libstdc++/manual/codecvt.html)。 – 2010-06-06 20:47:02

+0

對於語言環境和方面,我知道的唯一一本可以詳細介紹的書是http://www.angelikalanger.com/iostreams.html,但它只專門針對codecvt獲得了幾頁。 – 2010-06-06 21:16:01

+3

我不敢相信沒有人會在標準庫中知道這個類的下蹲 - 特別是考慮到它可能有多麼有用...... – 2010-06-06 22:38:22

回答

9

我寫了一個基於iconv的。它可以在Windows或任何POSIX OS上使用。 (你需要明確鏈接iconv)。

Enjoy

對於 「如何」 的問題,是按照 the codecvt reference答案。兩年前,我無法在互聯網上找到更好的指示。

重要告示

  • 理論上沒有必要爲這樣的工作。 codecvt_byname在任何標準支持平臺上應該足夠了。但實際上有一些編譯器不支持或不支持這個類。 不同編譯器的codecvt_byname接口也有所不同。
  • 我的工作示例是使用codecvt的狀態模板參數實現的。總是使用標準的mbstate類型,因爲這是使用標準iostream類的codecvt的唯一方法。
  • std :: mbstate_t類型不能用作跨平臺方式的64位平臺上的指針。
  • 無狀態轉換爲短字符串的工作,但如果你嘗試轉換一個數據塊大於流緩衝內部緩衝區的大小可能會失敗(UTF基本上是有狀態的編碼)
+1

+1 - 我不知道'codecvt_byname'存在,事實證明我的編譯器實際上正確地支持這樣的事情。 (誰知道?)不接受這一點,因爲它不是直接回答這個問題,但如果/當賞金到期時,你會得到分。 – 2010-06-07 09:35:29

4

這個std :: codecvt的問題是它是一個尋找問題的解決方案。或者說,它試圖解決的問題是無法解決的,所以任何試圖將其用作解決方案的人都會感到非常失望。

如果你不知道你的輸入或輸出是哪一個字符集,那麼std :: codecvt是永遠無法幫助你的。相反,如果確實知道你正在使用哪個字符集,那麼你可以通過一個函數調用來輕鬆地轉換它們。在複雜的模板中包裝該函數調用不會改變這些基礎。

...這就是爲什麼沒有人使用std :: codecvt。我建議你做別人做的事,假裝它從未發生過。

+2

我確切地知道我在用什麼代碼頁。我希望能夠指定哪個代碼頁用於iostreams。唯一的方法是使用'std :: codecvt'。當然,我可以毫無問題地在代碼頁之間轉換一段文本,但沒有辦法說,「將此整數格式設置爲8個空格寬,用零填充空格」,而沒有大量的'std :: wstringstream'秒。我寧願只是能夠使iostream本地轉換爲正確的代碼頁,因爲它已經有了這樣做的工具。 -1不回答問題。 – 2010-06-07 05:57:54

+4

至於「沒有人使用'std :: codecvt'」,你能解釋爲什麼Unicode的轉換方面正在C++ 0x中加入,而http://www.boost.org/doc/libs/1_43_0/libs/序列化/ doc/codecvt.html? – 2010-06-07 06:01:41

+2

可能希望人們一旦使用std :: codecvt,就不會再無用了。 – apenwarr 2010-06-07 21:46:33

相關問題