2009-12-27 90 views
2

我正在寫一個小的應用程序中,我從到控制檯,然後將其存儲在一個經典的char *字符串閱讀一些文字。
碰巧我需要將它傳遞給僅使用UTF-8編碼字符串的庫。由於Windows控制檯使用本地編碼,我需要從本地編碼轉換爲UTF-8。
如果我沒有記錯的話,我可以使用的MultiByteToWideChar(..)編碼爲UTF-16,然後使用調用WideCharToMultiByte(..)來轉換爲UTF-8。從本地編碼轉換C字符串以UTF8

但是我不知道是否有直接從本地編碼轉換爲UTF-8,而無需使用任何外部利布斯的一種方式,因爲轉換到WCHAR的想法只是爲了能夠轉換回CHAR(UTF-8編碼但仍)對我來說似乎有點奇怪。

回答

4

從UTF-16轉換爲UTF-8,純粹是一個機械過程,而是從本地編碼轉換爲UTF-16或UTF-8涉及到一些大的專門的查找表。 c-runtime只是轉過來,爲非平凡的情況調用WideCharToMultiByte和MultiByteToWideChar。

至於不必使用UTF-16作爲中間階段,據我所知,目前不在身邊,任何方式 - 對不起。

由於您已經鏈接到外部庫以獲取文件輸入,因此您最好鏈接到同一個庫以獲取WideCharToMultiByte和MultiByteToWideChar。

使用c-runtime將使您的代碼可以重新編譯到其他操作系統(理論上),但它也會在您和庫之間增加一層開銷,在這種情況下執行所有實際工作 - kernel32 .dll文件。

+0

這將只是一個方便,能夠直接做到這一點。 它確實讓我覺得一個區別,如果我要爲UTF16字符串分配內存並做2個functioncalls,而不是僅僅調用一個函數,並檢查是否有錯誤錯誤檢查。 我想多數民衆贊成的價格,你必須支付時,試圖保持unicode兼容:) – 2009-12-27 02:54:32

4

POSIX的世界愛的iconv lib中這一點。它使用char *轉換並幾乎轉換爲每個編碼。