我正在为我的应用程序创建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
适用于所有语言?
有人可以解释一下这是如何运作的吗?
答案 0 :(得分:0)
行。答案是这是UTF-8
编码,它的设计长度可变。在Wikipedia中,它回答了我的问题:“Linux如何知道这些2个字符是单个2字节字符?”
答案是从那里引用的:
由于在将非ASCII代码点编码为UTF-8时不会发生ASCII字节,因此UTF-8可以安全地用于以特殊方式解释某些ASCII字符的大多数编程和文档语言,例如字符串结尾。
因此,在解释这些字母时没有歧义。