![マルチ文字エンコーディングで動作するコンソールプログラムを書くことはできますか? [コピー]](https://linux33.com/image/134687/%E3%83%9E%E3%83%AB%E3%83%81%E6%96%87%E5%AD%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
私はCでコンソールプログラムを書いています。
プログラムを実行している端末の文字エンコーディングをUTF-8に設定したいと思います。これは、UTF-8でエンコードされた文字列を端末に送信し、端末からUTF-8でエンコードされた文字列を受信すると予想することを意味します。
ただし、プログラムの実行中に端末を別の文字エンコード(UTF-8以外)に設定すると、プログラムは期待どおりに機能しません。
それでは、私のプログラムで端末がどの文字エンコーディングに設定されているかを知る方法はありますか(したがって、プログラムの動作をそれに応じて変更できますか?)。そのような方法があっても、私のプログラムにマルチキャラクタエンコーディングを使用させる必要があるのでしょうか、それともUTF-8を使用するだけですか?
答え1
UTF-8にはいくつかの欠陥があるため、中央ヨーロッパの一般的なエンコーディングではありません。
UTF-8を想定するプログラムを書くのは悪い習慣です。なぜなら、バイトストリーム内の「文字」が終わる場所を知らないかもしれないからです。
適切なプログラム呼び出し:
setlocale(LC_ALL, "")
起動時および後で次の機能を使用してください。
mbtowc(&wc, input, amt)
標準入力またはファイルから読み取られたマルチバイト入力を変換します。
その後、データをワイド文字として処理し、次のようにマルチバイトデータに変換します。
wctomc(output, wc)
その後、出力はstdoutとして印刷されます。