文件名如何在`char`和2-byte字符之间起作用?

时间:2017-02-11 17:22:22

标签: c++ linux boost character-encoding locale

我正在为我的应用程序创建boost::filesystem的包装器。我正在调查如果文件名中有一些非ASCII字符会发生什么。

在Windows上,the documentation表示所有字符均为wchar_t。这是非常容易理解和连贯的。

但是在Linux上,the documentation表示所有字符都是char!所以1字节字符。我想知道,这甚至可以工作并读取非ASCII字符吗?所以我创建了一个阿拉伯名字تجريب的目录(这是一个5个字母的单词),并用boost::filesystem读取。我在终端上打印了它,它工作正常(除了终端,终结器,从左到右错误地写了)。终端上的打印结果是:

/mnt/hgfs/D/تجريب

有些东西没有加起来。这怎么可能是1字节char字符串,仍然打印阿拉伯名字?所以我做了以下事情:

std::for_each(path.string().begin(), path.string().end(), [](char c) {
    std::cout<<c<<std::endl;
});

运行这个给出path是我上面提到的目录,给出了:

/
m
n
t
/
h
g
f
s
/
D
/
�
�
�
�
�
�
�
�
�
�

在这一点上,我真的,真的迷路了。阿拉伯语单词是10个字节,创建一个5个字母的单词。

我的问题:部分字符为1字节,部分字符为2字节。 linux如何知道那些2个字符是单个2字节字符?这是否意味着我的Linux文件系统永远不需要2字节字符,char适用于所有语言?

有人可以解释一下这是如何运作的吗?

1 个答案:

答案 0 :(得分:0)

行。答案是这是UTF-8编码,它的设计长度可变。在Wikipedia中,它回答了我的问题:“Linux如何知道这些2个字符是单个2字节字符?”

答案是从那里引用的:

  

由于在将非ASCII代码点编码为UTF-8时不会发生ASCII字节,因此UTF-8可以安全地用于以特殊方式解释某些ASCII字符的大多数编程和文档语言,例如字符串结尾。

因此,在解释这些字母时没有歧义。