2013-08-28 60 views
2

Linux對其文件API使用什麼編碼?我應該如何在C++中使用路徑字符串,使用什麼類?我的意思是非ASCII字符的路徑。在Windows上,我使用UTF-16和std::wstring,在Mac-UTF-8和我自己的UTF-8字符串類中。但不幸的是,我的課程在Linux上不可用,所以我應該使用什麼?在Linux上使用文件路徑字符串,使用什麼編碼?

+0

我實際上傾向於避免文件路徑中存在非ASCII或空格字符。 –

+0

@BasileStarynkevitch:我同意這些課程,但如果你的母語不是英語,那麼它就行不通。例如,我需要保存許多必須有非英文名稱的視頻和音樂文件,否則它們將完全失去其原始含義。 – mvp

+0

@BasileStarynkevitch:我也是,但我不能指望我的德國和日本用戶也這樣做:) –

回答

6

在內部,Linux允許使用任何字節序列作爲文件名,空字節0和正斜槓'/'(用作目錄分隔符)除外。

在Linux上允許Unicode文件名的通用約定是使用UTF-8編碼文件名。最簡單的方法是使用舊的std::string(不是在Windows上建議的std::wstring),但是,您可能需要編寫自己的類,以驗證它的確是有效的UTF-8

有現成的使用庫,提供處理UTF-8字符串的幾個例子:

  • ICU(健壯,但很沉重)。
  • Glib::ustring(隱含轉換爲std::string,GPL)。
  • UTF8-CPP(非常輕量級,僅標頭)。
+0

好的答案,指出空字節和斜槓是特殊的。 +1 –

+0

感謝您提供UTF-8字符串庫的列表,我可能會使用UTF8-CPP。所以,當我調用返回'char *'的系統API時,我應該期待UTF-8? –

+1

一般來說 - 是的,其他程序創建的文件名應該用'UTF-8'編碼。你應該期待這一點,但準備接受無效的「UTF-8」。這就像是規則FCC 15 - 玩的很好,但不要撞別人不好。 – mvp

0

您仍然可以在使用wchar_t時使用標準類型wchar_t(和%ls用於printf/scanf)。這種類型允許你使用非ASCII字符。

wchar_t mystring[50] = L"sometext"; 

注意:進行正常的字符串入您必須使用固定的預「L」 wchar_t的,你要記住,這是不一樣的一個char類型,以便其有點滑稽的使用方法: o

+0

這不是我的問題的答案。我將系統調用的字符串作爲'char *'接收,據我所知,沒有標準的C++方式將UTF-8轉換爲UTF-16。 –

+0

對不起,我想我誤解了你的問題。 –

1

Linux不對文件名執行編碼。儘管使用UTF-8是很常見的。

相關問題