2013-08-28 48 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是很常见的。

相关问题