Linux環境で、Cプログラミング言語でランタイム文字セットを設定するには?
たとえば、iso8859-1、utf-8、または ascii に設定したいです。
Linux環境で、Cプログラミング言語でランタイム文字セットを設定するには?
たとえば、iso8859-1、utf-8、または ascii に設定したいです。
言いたいことをもう少し具体的にする必要があります。ほとんどの場合、C には実際には文字セットがありません。その文字列は単に null で区切られたバイトの文字列であり、それらをエンコードまたはデコードするために何もしません。
C 標準ライブラリと POSIX には、現在のロケールに依存する関数がいくつかあります。useを使用setlocale
して現在のロケールを設定できます。デフォルトは C ロケールで、文字列は ASCII として扱われ、バイト値に従って比較されます。
文字セットを変換する場合は、iconv
;を使用します。これにより、バッファをあるエンコーディングから別のエンコーディングに変換できます。たとえば、テキストを内部的に UTF-8 で表現し、ISO-8859-1 で印刷したい場合は、これを使用します。
編集して追加: 別の回答に関するコメントから、次のように尋ねます。
端末の予期される文字セットを「ISO 8859-1」に設定しましたが、関数を呼び出すと、
setlocale( LC_CTYPE, NULL );
まだ返されるのはC
なぜですか?ISO 8859-1
これは端末の予想される文字セットであるため、返されるはずです。
プログラム起動時のロケールは常に「C」です。環境変数に基づいてロケールを設定する場合は、setlocale( LC_ALL, "")
またはを呼び出す必要がありsetlocal( LC_CTYPE, "")
ます。つまり、空の文字列を渡す必要があり、その後、環境変数に基づいてロケールが設定されます。
行うことprintf( "%c", '\xa3')
は常に同じです。値 0xA3 (= 163) を持つ1 バイトを標準出力ストリームに出力します。
画面に表示される内容は、値 163 が書き込まれたバイトを見て端末 (xterm や Linux コンソールなど) がどのように反応するかによって異なります。これは端末の文字設定の問題であり、C プログラムが直接影響を与える方法はありません。あなたがする必要があるのは、Cプログラムが端末が期待する文字セットを見つけて、それに一致する出力を生成できるようにすることです。
単純なプログラムは、多くの場合、入力の文字セットが出力の文字セットであると想定することで回避できます。その後、文字セットの問題を無視し、出力の高ビットバイトをそのまま正確に再現します。入力。(Unicode の UTF-8 エンコーディングは、多くの場合にこの戦略が機能するように意図的に設計されています)。
ただし、そうでない場合 (プログラムに英語以外の文字を含むハードコーディングされた文字列が含まれている場合など)、ロケール関数を使用して、プログラムが生成する文字エンコーディングを特定する必要があります。それを行う。libiconv などのライブラリは、多くの場合、これを比較的簡単に行うことができます。
setlocale(3)
プログラムの現在のロケールを設定するを参照してください。
標準 C はsetlocale()
、ロケールを設定する関数を提供します。LC_CTYPE の値は、文字タイプを定義します。詳細については、POSIXの説明も参照してください。システムでサポートされているロケールを確認するには、次を実行します。
locale -a