2017-02-11 6 views
0

私のアプリケーション用にboost::filesystemのラッパーを作成しています。ファイル名にASCII以外の文字が含まれていると、何が起こるか調べています。ファイル名は `char`と2バイト文字の間でどのように動作しますか?

Windowsでは、the documentationはすべての文字がwchar_tであることを示します。それは非常に理解でき、一貫しています。

Linuxでは、the documentationは、すべての文字がcharだと言います!だから1バイト文字。私は疑問に思っていました、これは動作し、非ASCII文字を読むでしょうか?そこで、私はアラビア語の名前تجريب(5文字の単語)を作成し、それをboost::filesystemと読んでいます。私はターミナルでそれを印刷し、正常に機能しました(ターミナル、ターミネーター以外は、左から右に間違って書いていました)。端末の印刷結果は次のとおりです。

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

何かがそこに追加されませんでした。これはどのようにして1バイトのchar文字列になりますが、アラビア語の名前は印刷できますか?だから私は、次のようでした:

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

をこの時点で、私は本当に、本当に迷子になった:

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

そして、これを実行しているpathは、私は、上記与えたディレクトリです与えました。アラビア語は10バイトで、5文字の単語が作成されます。

ここに私の質問が来る:文字の一部は1バイトで、文字の一部は2バイトです。 Linuxでは、これら2文字が2バイト文字であることをどのように知っていますか?これは、ファイルシステムのためにLinux上で2バイト文字を使う必要がないことを意味しますか?charはすべての言語に適していますか?

誰かがこの機能の仕組みを説明できますか?

+0

どのようにして '/ mnt/hgfs/D /تجريب'出力を生成しましたか? 'ls'を使う? –

+0

[UTF-8](https://en.wikipedia.org/wiki/UTF-8)です。 – Fanael

+0

@πάνταῥεῖ 'std :: cout << path << std :: endl;' –

答えて

0

OK。答えは、これはUTF-8エンコーディングであり、これは設計上可変長です。 Wikipediaでは、それは私の質問に答える: "どのようにそれらの2文字が単一の2バイト文字であることを知っているのですか?

答えはそこから引用された:UTF-8に非ASCIIコードポイントをエンコードする際

ASCIIのバイトは発生しないので、UTF-8が解釈し、ほとんどのプログラミングとドキュメントの言語内で使用しても安全です特定のASCII文字(文字列の終わりなど)。

したがって、文字を解釈するときに曖昧さはありません。

関連する問題