2009年6月19日

[debian-users:52572] nl_langinfo(CODESET) returns ANSI_X3.4-1968

土屋です.

最近,Windows 上で漢字を含むファイル名を使った zip ファイルを受け取る機
会が増えてきたので,

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=483290

のパッチを適用して unzip を再パッケージしました.それで,その再パッケー

ジした unzip コマンドで

unzip -O CP932 test.zip

のようにしたのですが,正しくファイル名が decode されません.

それで原因を調べていたところ,nl_langinfo(CODESET) が正しい値を返していな
いことに気づきました.添付したテスト用の source を保存し,コンパイルして
実行すると,

% gcc -o test_langinfo test_langinfo.c
% ./test_langinfo
ANSI_X3.4-1968

という結果になります.マニュアル nl_langinfo(3) によれば,

CODESET (LC_CTYPE)
選択されたロケールで用いられる文字エンコード名を示す文字列を返す。
<中略> この文字列は、"locale charmap" を実行して得られるものと同
じである。

となっているのですが,

% locale charmap
UTF-8

となり,nl_langinfo(CODESET) を実行した場合と,locale コマンドを実行した
場合とで,結果が異なってしまっています.環境変数の設定は

% printenv LANG
ja_JP.UTF-8

のみです.また,

% grep -v ^# /etc/locale.gen
en_US ISO-8859-1
en_US.UTF-8 UTF-8
ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

となっていますので,必要な locale database が生成されていない,ということ
もないはずだと思います.

というような状態なのですが,何の設定が足りないのでしょうか?

--
土屋 雅稔 ( TSUCHIYA Masatoshi )


#include <stdio.h>
#include <langinfo.h>

int main(void){
char *local_charset = nl_langinfo(CODESET);
printf( "%s\n", local_charset );
return 0;
}

投稿者 xml-rpc : 2009年6月19日 14:30
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/85985
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。