c - 書き込み - matlab ファイル 読み込み




fopenまたはopenを呼び出すときに使用されるエンコードは何ですか? (3)

' open 'のようなLinuxや ' fopen 'のようなstdio関数でシステムコールを呼び出すときは、 ' const char * filename 'を指定しなければなりません。 私の質問は、ここで使われているエンコーディングは何ですか? それは、UTF-8、ASCII、またはiso8859-xです。 システムや環境設定に依存しますか?

私はMS Windowsにutf-16を受け入れる_wopenあることを知っています。


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

つまり、何もする必要はないということです(ファイル名は不透明なバイト文字列として扱われます)が、実際にはファイル名を受け取る場所や、ファイル名を操作する必要があるかどうかによって異なります。


このトピックについてさらにお問い合わせをしたところ、unixoidファイルシステムでファイル名のエンコードを処理する方法は2つあります。

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

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

GTK +はUTF-8を仮定し、現在のロケールエンコーディングかユーザー提供のエンコーディングのどちらかによってそれをオーバーライドできるようにすることでこの混乱を解決します。

Qtはロケールエンコーディングを仮定し(そしてそのシステムロケールが現在のロケールに反映される)、それをユーザ提供の変換関数で上書きすることを可能にすることでそれを解決します。

つまり、結論は次のとおりです。UTF-8を使用するか、デフォルトでLC_ALLまたはLANGが指示するものを使用し、少なくとも他の方法では上書き設定を指定します。


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





system-calls