2013-01-04 173 views
10

在我正在研究的項目中,我處理了很多字符串操作;從二進制文件中讀取字符串以及它們的編碼(可以是單字節或雙字節)。本質上,我讀取字符串值爲vector<char>,讀取編碼,然後將所有字符串轉換爲wstring,以保持一致性。如何讀取unicode文件名C++的二進制文件?

這工作相當好,但文件名本身可以是雙字節字符。我完全難以理解如何實際打開輸入流。在C中,我將使用_wfopen函數傳遞wchar_t* path,但wifstream似乎行爲不同,因爲它專門爲從文件中讀取雙字節字符而設計,而不是從具有雙字節文件名的文件中讀取單個字節。

這個問題的解決方案是什麼?

編輯:在網絡中搜索,看起來在標準C++中根本不支持這個(例如參見this discussion)。但是我想知道C++ 11是否真的在這個領域增加了一些有用的東西。

+0

我會避免使用'wchar_t'和'wstring',因爲'wchar_t'在編譯器中不可移植(它在VC++中是16位,在gcc中是32位)。 C++ 11引入了'char16_t'和'char32_t',但顯然你可以自己'typedef'。 –

+0

@Matthieu M.我不太擔心VC++,因爲它不是我的目標編譯器之一。我需要先讓代碼在基於unix的系統上工作。 –

+0

這裏是相同的問題,但僅適用於Windows:[如何用unicode文件名打開std :: fstream(ofstream或ifstream)](http://stackoverflow.com/q/821873/33499) – wimh

回答

1

您傳遞的打開字符串如何映射到文件名是依賴於實現的 。在Unix環境下,它幾乎按字面順序通過 —只有'/'和特別對待 。在其他環境中,其他規則的規則,我以前有問題,因爲我在Unix中編寫了一個文件,並且 在Windows下無法執行任何操作(特別是在文件名中處理':' ) 。

另一個問題是這些文件來自哪裏。正如上面提到的 ,可能絕對沒有辦法在您的 系統上打開它們:':'的文件名根本無法在 Windows中打開。在Unix中,如果你最終在 文件名中包含'\0'字符,那麼你可能無法讀取它們,並且UTF16 文件名將在 Unix下顯示爲'\0'字符。你唯一的解決方案可能是在生成文件的 系統上使用本地工具來重命名它們。

這對我來說不太清楚,首先你如何在Unix上獲得這樣的文件名。 Samba 等中小型企業服務器如何在Windows服務器上提供UTF16文件名?或者一個 NFS服務器—我認爲這樣的事情也存在於Windows下。

+0

在Linux中,文件名到UTF-8(標準代碼頁)的映射是由驅動程序完成的,驅動程序通常可以配置(即對於使用mount選項「iocharset」的cifs(smb))。 – filmor