簡體   English   中英

我如何編寫 std::codecvt 方面?

[英]How do I write a std::codecvt facet?

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

跨平台是首選,但 Windows 上的 MSVC 也很好。 是否有關於如何正確使用此類的任何類型的教程或任何此類性質的內容?

我已經基於 iconv 寫了一個。 它可以在 Windows 或任何 POSIX 操作系統上使用。 (您顯然需要與 iconv 鏈接)。

享受

“如何”問題的答案是遵循codecvt 參考 兩年前我在互聯網上找不到更好的說明。

重要通知

  • 理論上不需要這樣的工作。 codecvt_byname在任何標准支持平台上都應該足夠了。 但實際上有一些編譯器不支持或嚴重支持這個類。 codecvt_byname 在不同編譯器上的接口也有差異。
  • 我的工作示例是使用 codecvt 的狀態模板參數實現的。 始終在那里使用標准 mbstate 類型,因為這是將 codecvt 與標准 iostream 類一起使用的唯一方法。
  • std::mbstate_t 類型不能以跨平台方式用作 64 位平台上的指針。
  • 無狀態轉換適用於短字符串,但如果您嘗試轉換大於 streambuf 內部緩沖區大小的數據塊,則可能會失敗(UTF 本質上是有狀態編碼)

這個 std::codecvt 的問題是它是一個尋找問題的解決方案。 或者更確切地說,它試圖解決的問題是無法解決的,因此任何試圖將其用作解決方案的人都會非常失望。

如果您不知道您的輸入或輸出是哪個字符集,那么 std::codecvt 將永遠無法幫助您。 相反,如果您確實知道正在使用哪些字符集,那么您可以通過單個函數調用輕松地在它們之間進行轉換。 將該函數調用包裝在一堆復雜的模板中並不會改變這些基本原理。

...這就是為什么沒有人使用 std::codecvt 的原因。 我建議你做其他人都做的事情,假裝它從未發生過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM