2009-07-19 52 views
4

我需要一個文件io庫,它可以爲我的程序提供一個utf-16(小端)接口,但可以處理其他編碼中的文件,主要是ascii(僅用於輸入),utf-8,utf-16 ,utf-32/ucs4包括小端和大端字節順序。C++ unicode文件io

查看了我發現的唯一一個庫是ICU ustdio.h庫。

我確實嘗試過,但是我甚至可以用一個非常簡單的文本工作,並且它的用法上幾乎沒有任何文檔,只有ICU文件參考頁面沒有提供任何示例和很少的細節例如,從現有的FILE中創建一個UFILE,使用FILE *和其他幾個函數以及其他幾個函數是安全的)。

而且ID遠,而一個C++庫,可以給我在一個C風格的界面寬流接口...

std::wstring str = L"Hello World in UTF-16!\nAnother line.\n"; 
UFILE *ufile = u_fopen("out2.txt", "w", 0, "utf-16"); 
u_file_write(str.c_str(), str.size(), ufile); 
u_fclose(ufile); 

輸出

Hello World in UTF-16!਍䄀渀漀琀梔攀爀 氀椀渀攀⸀ഀ 

六角

FF FE 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 
6F 00 72 00 6C 00 64 00 20 00 69 00 6E 00 20 00 
55 00 54 00 46 00 2D 00 31 00 36 00 21 00 0D 0A 
00 41 00 6E 00 6F 00 74 00 68 00 65 00 72 00 20 
00 6C 00 69 00 6E 00 65 00 2E 00 0D 0A 00 

編輯:窗口上的正確輸出將是:

FF FE 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 
6F 00 72 00 6C 00 64 00 20 00 69 00 6E 00 20 00 
55 00 54 00 46 00 2D 00 31 00 36 00 21 00 0D 00 
0A 00 41 00 6E 00 6F 00 74 00 68 00 65 00 72 00 
20 00 6C 00 69 00 6E 00 65 00 2E 00 0D 00 0A 00 

回答

1

我認爲問題來自0D 0A 00 linebreaks。你可以嘗試,如果其他換行符像\r\n或使用LF或CR單獨做的工作(最好的選擇是使用\r,我想)

編輯:看來0D 00 0A 00是你想要的,所以你可以嘗試

std::wstring str = L"Hello World in UTF-16!\15\12Another line.\15\12"; 
+0

嘗試之類的東西,\ r作品,\ n由一個破碎的\ r \ n,即\ r \更換在我的字符串n變成0D 00 0D 0A 00 – 2009-07-19 11:22:24

2

UTF8-CPP爲您提供了UTF-8,16和32之間的轉換。非常漂亮而輕便的庫。

關於ICU,由UTF8-CPP的創建者一些意見:

ICU庫。它功能非常強大,功能齊全,功能齊全,並且可以廣泛應用於 。也是非常大的侵入性, 非通用,並且與標準庫不能很好地發揮 。 I definitelly建議您查看ICU 即使您不打算使用它。

:)

4

您看到的問題來自換行轉換。不幸的是,它是在字節級(在代碼轉換之後)進行的,並且不知道編碼。 IOWs,您必須禁用自動轉換(通過以「b」標誌以二進制模式打開文件),並且如果您想將0A00擴展爲0D00A00,則必須自己完成。

你提到你喜歡C++寬流接口,所以我將概述我做了什麼來實現,在我們的軟件:

  • 寫使用ICU UConverter一個std ::小的codecvt執行轉換。
  • 使用一個std :: wfstream在wfstream
  • 打開與二進制標誌wfstream打開文件
  • 灌輸()自定義的codecvt,關閉自動(和錯誤的)換行轉換。
  • 寫一個「WNewlineFilter」來執行wchar上的換行轉換。使用靈感boost::iostreams::newline_filter
  • 使用boost::iostreams::filtering_wstream將wfstream和WNewlineFilter結合在一起成爲一個流。