私のアプリケーション用に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
はすべての言語に適していますか?
誰かがこの機能の仕組みを説明できますか?
どのようにして '/ mnt/hgfs/D /تجريب'出力を生成しましたか? 'ls'を使う? –
[UTF-8](https://en.wikipedia.org/wiki/UTF-8)です。 – Fanael
@πάνταῥεῖ 'std :: cout << path << std :: endl;' –