14

openLinux で ' ' のようなシステム コールまたは ' ' のような stdio 関数を呼び出すときはfopen、' ' を指定する必要がありますconst char * filename。私の質問は、ここで使用されているエンコーディングは何ですか? それは utf-8 か ascii か iso8859-x ですか? システムや環境設定に依存しますか?

_wopenMS Windows には、 utf-16 を受け入れるがあることを知っています。

4

6 に答える 6

8

これはバイト文字列で、解釈は特定のファイルシステム次第です。

于 2010-01-05T11:12:10.413 に答える
4

Linuxでのファイルシステム呼び出しはエンコーディングに依存しません。つまり、特定のエンコーディングを認識していません(必要はありません)。それらに関する限り、filename引数が指すバイト文字列はそのままファイルシステムに渡されます。ファイルシステムは、ファイル名が正しいエンコーディング(通常、Matthew Talbertが言及しているUTF-8)であることを想定しています。

これは、多くの場合、何もする必要がないことを意味します(ファイル名は不透明なバイト文字列として扱われます)が、実際には、ファイル名をどこから受け取るか、およびファイル名を何らかの方法で操作する必要があるかどうかによって異なります。

于 2010-01-05T11:54:15.733 に答える
4

システムのロケールに依存します。「locale」コマンドの出力を見てください。変数が UTF-8 で終わる場合、ロケールは UTF-8 です。最新の Linux のほとんどは UTF-8 を使用します。技術的には単なるバイト文字列であるという Andrew の意見は正しいですが、システム ロケールに一致しない場合、一部のプログラムが正しく動作せず、正しいユーザー入力を取得できなくなる可能性があります。UTF-8 を使用することをお勧めします。

于 2010-01-05T11:14:44.923 に答える
-1

このトピックについてさらに調査を行った結果、unixoid ファイル システムでファイル名のエンコーディングを処理するには 2 つの異なる方法があるという結論に達しました。

  1. ファイル名は「システム ロケール」でエンコードされます。これは通常は同じですが、localeコマンドによって反映される現在の環境ロケールと同じである必要はありません (ただし、グローバル構成ファイルにいくつかのプリセットがあります)。

  2. ファイル名は、ロケール設定に関係なく、UTF-8 でエンコードされます。

GTK+ は、UTF-8 を想定し、現在のロケール エンコーディングまたはユーザー指定のエンコーディングでオーバーライドできるようにすることで、この混乱を解決します。

Qt は、ロケール エンコーディングを想定し (そしてそのシステム ロケールが現在のロケールに反映される)、ユーザー指定の変換関数でオーバーライドできるようにすることで、この問題を解決します。

つまり、結論は次のとおりです。UTF-8、またはデフォルトで LC_ALL または LANG が指示するもののいずれかを使用し、少なくとも他の代替手段に対してオーバーライド設定を提供します。

于 2015-05-13T19:56:26.193 に答える