私は iconv C API を使用しており、iconv でコンピューターのローカル エンコーディングを検出したいと考えています。それは可能ですか?ソース コードを調べると、ファイルiconv_open1.hで、fromcode
またはtocode
変数が空の文字列 ( ) の場合、関数呼び出し""
を使用してローカル エンコーディングが使用されていることがわかります。locale_charset()
ロケールエンコーディングをユニコードに変換するために必要なのは、iconv_open ("UTF-8", "")
残念ながら、ドキュメントにはこれについての言及はありません。
また、一部の iso-8859-1 テキストをロケール エンコーディング (私のマシンでは utf-8) に変換すると、変換中に errno=EILSEQ (不正なシーケンス) が発生します。チェックしたところ、iconv_open はエラーを返しませんでした。
の空の文字列の代わりにiconv_open
を指定する"utf-8"
と、エラーは発生しません。明らかに、iconv は現在の文字セットを検出できませんでした。
編集:私は簡単なCプログラムでチェックしましたputs(nl_langinfo(CODESET))
(ANSI_X3.4-1968
これはASCIIです)。どうやら、文字セットの検出に問題がありました。
編集: これは、なぜ nl_langinfo(CODESET) がロケールのチャームマップと異なるのですか?に関連している必要があります。
追加情報: 私のプログラムは Ada で書かれており、リンク時に C 関数にバインドしています。どうやら、ロケール設定は、Ada ランタイムと C ランタイムで同じように初期化されていません。