CentOS5でのiconvコマンドのバグについて

このQ&Aのポイント
  • CentOS5にて、utf8のファイルをeucjpにiconvで変換しようとすると、ISO-8859になるバグが発生しています。
  • iconvコマンドを使用してUTF-8のファイルをEUC-JPに変換する際、CentOS5ではISO-8859に変換されるというバグが発生しています。
  • CentOS5のiconvコマンドでUTF-8のファイルをEUC-JPに変換しようとすると、予期せぬISO-8859のファイルが生成されるバグが存在します。
回答を見る
  • ベストアンサー

centos5にてiconvコマンド

いつもお世話になっております。 すみません。 centos5にて、utf8のファイルをeucjpにiconvで変換しようとしていますが、 下記のコマンド実行後、eucではなく、ISO-8859になってしまいます。 こちら、バグなのでしょうか。 お手数をおかけしますが、ご存知の方、ご教授いただけると助かります。。 [foo@localhost ~]$ file /tmp/in.dat /tmp/in.dat: UTF-8 Unicode text [foo@localhost ~]$ iconv -f utf8 -t eucjp < /tmp/in.dat > /tmp/in.euc.dat [foo@localhost ~]$ file /tmp/in.euc.dat /tmp/in.euc.dat: ISO-8859 text [foo@localhost ~]$ iconv --list | grep UTF ISO-10646/UTF-8/ ISO-10646/UTF8/ UTF-7// UTF-8// UTF-16// UTF-16BE// UTF-16LE// UTF-32// UTF-32BE// UTF-32LE// UTF7// UTF8// UTF16// UTF16BE// UTF16LE// UTF32// UTF32BE// UTF32LE// [foo@localhost ~]$ iconv --list | grep EUC CSEUCKR// CSEUCPKDFMTJAPANESE// EUC-CN// EUC-JISX0213// EUC-JP-MS// EUC-JP// EUC-KR// EUC-TW// EUCCN// EUCJP-MS// EUCJP-OPEN// EUCJP-WIN// EUCJP// EUCKR// EUCTW//

  • uff-n
  • お礼率54% (47/87)

質問者が選んだベストアンサー

  • ベストアンサー
  • astronaut
  • ベストアンサー率58% (303/516)
回答No.1

fileコマンドがテキストファイルの文字コードの識別にそこまで対応していないだけではないかと思います。 以下、`man file` から抜粋 If a file does not match any of the entries in the magic file, it is examined to see if it seems to be a text file. ASCII, ISO-8859-x, non-ISO 8-bit extended-ASCII character sets (such as those used on Macintosh and IBM PC sys- tems), UTF-8-encoded Unicode, UTF-16-encoded Unicode, and EBCDIC character sets can be distinguished by the different ranges and sequences of bytes that con-stitute printable text in each set. If a file passes any of these tests, its character set is reported. ASCII, ISO-8859-x, UTF-8, and extended-ASCII files are identified as ''text'' because they will be mostly readable on nearly any terminal; UTF-16 and EBCDIC are only ''character data'' because, while they contain text, it is text that will require translation before it can be read. In addition, file will attempt to determine other characteristics of text-type files. If the lines of a file are terminated by CR, CRLF, or NEL, instead of the Unix-standard LF, this will be reported. Files that contain embedded escape sequences or overstriking will also be identified.

uff-n
質問者

お礼

ありがとうございました。 fileコマンドがテキストファイルの識別にそこまで対応していないですね。 ご回答感謝します。

関連するQ&A

  • 文字コード変換の件( nkf -w8 と iconv )

    nkfでのオプション:w8に該当するiconvのパラメータをご存知のかたは教えていただきたいと思います。 nkf -w8での変換結果はファイル先頭3バイトにiconvでの変換結果と異なるコードが付いているようです。 iconvにて次のパラメータは試しましたが、いずれもファイル先頭3バイトが nkf -w8の結果とは異なっています。 UTF-8 UTF-16 UTF-16BE UTF-16LE UNICODE なお、versionなどは関係ないとは思いますがfedora-10-preview環境です。

  • SFU3.5のiconvコマンドで文字コード変換(EUC->SJIS)すると'-'が'_'に誤変換されてしまう

    OS:Windows Server 2003 SFUバージョン:Microsoft Windows Services for UNIX 3.5 ファイルの文字コードをEUCからSJISに変換するため以下コマンドを実行しました。 >iconv -f 20932 -t 932 EUC_FILE.txt > SJIS_FILE.txt この後、変換後のSJIS_FILE.txtを参照すると、ほとんど問題ないのですが一点だけ問題があり、'-'が'_'に誤変換されていました。 例を挙げると、以下のような誤変換です。 ○ スウェ-デン輸出信用銀行 × スウェ_デン輸出信用銀行 もしかすると、EUC=20932,SJIS=932と指定しましたが、このコードが間違っているのでしょうか?参考までにコードのリストを以下に出力します。(明らかに関係なさそうな出力は文字数節約のため削除します。) >iconv -l 10001 (MAC - 日本語) 1146 (IBM EBCDIC - 英国 (20285 + ユーロ)) 20127 (US-ASCII) 20261 (T.61) 20269 (ISO 6937 Non-Spacing Accent) 20290 (IBM EBCDIC - 日本語 カタカナ拡張) 20932 (JIS X 0208-1990 & 0212-1990) 20936 (簡体字中国語 GB2312) 21027 (Ext Alpha Lowercase) 437 (OEM - 米国) 500 (IBM EBCDIC - インターナショナル) 50220 (ISO-2022 日本語、半角カタカナなし) 50221 (ISO-2022 日本語、半角カタカナ) 50222 (ISO-2022 日本語 JIS X 0201-1989) 932 (ANSI/OEM - 日本語 Shift-JIS) 936 (ANSI/OEM - 簡体字中国語 GBK) 949 (ANSI/OEM - 韓国語) 950 (ANSI/OEM - 繁体字中国語 Big5) 54936 (GB18030 簡体字中国語) 28603 (ISO 8859-13 ラテン 7) 65000 (UTF-7) 65001 (UTF-8) 以上、解決策などご存知の方どうぞご教授のほど、よろしくお願いいたします。

  • MySQL4.1の日本語化

    自分で出来るところまでやったのですが、日本語を入力すると???となってしまいます。以下に状況を挙げますので、知識のある方は知恵をお貸し下さい。 version:Mysql4.1.20,php5.2.2 OS:CentOS 4.4 my.cnfにおいて [mysqld] default-character-set = utf8 [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8 Php.iniにおいて mbstring.internal_encoding = EUC-JP ;mbstring.http_input = auto mbstring.http_output = EUC-JP ↓↓ mbstring.internal_encoding = UTF-8 ;mbstring.http_input = auto mbstring.http_output = UTF-8 ;iconv.input_encoding = ISO-8859-1 ;iconv.internal_encoding = ISO-8859-1 ;iconv.output_encoding = ISO-8859-1 ↓↓ iconv.input_encoding = UTF-8 iconv.internal_encoding = UTF-8 iconv.output_encoding = UTF-8 PHPスクリプトに関して、SET NAMESとキャラクタセットをUTF-8とする。 という感じです。 show variables like 'character%';を行うと +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ という感じです。 何が原因なのでしょうか。。初心者ではありますが、素人なりに設定はあっていそうな気がします。詳しい方は何卒よろしくお願いします。

    • ベストアンサー
    • MySQL
  • gccでiconvを使った文字コード変換で文字化け?

    Linuxでgccを使ってプログラムを作っていますが、文字コード変換が一部分うまくいかなくて困ってます。 Shift-JISで作られたテキストファイルから一行ずつ文字を読み込んで、 それをUTF-8に変換して画面に出力しているんですが、 「神石高原町」だけ文字化けしているのか、表示されません。 前後の行は表示されるのでちょうど1行空白になる感じです。 とりあえず変換用に作った関数。 BOOL SJIStoUTF( char* pin, // (IN) 変換元文字列 char* pout, // (OUT) 変換後文字列格納領域 size_t olen) // (IN) 変換後文字列格納領域サイズ { iconv_t cd; size_t ilen, rlen; cd = iconv_open( "UTF-8", "SJIS-WIN" ); ilen = strlen( pin ); rlen = iconv(cd, &pin, &ilen, &pout, &olen ); if( rlen == -1 ){ printf( "ERROR in S2U (%s)\n", pin ); return FALSE; } *pout = '\0'; iconv_close( cd ); return TRUE; } この関数に「神石高原町」を与えて返ってきた文字をファイルに出力して、 秀丸の文字コードUTF-8で開くと変換できなかった文字が「神」の前にあり、文字も「神石高原」になるし・・・。 Linuxのコンソール上でiconvのコマンド使ってファイルごと変換すれば 文字化けしないんですけど、 gccでiconv使うときは気をつけなきゃだめなことがあるんでしょうか? なんでこうなるのかわかる方がいたら教えてください。

  • Perlの文字コードを意識したファイルの読み込み方

    perl5.8でファイルを読み込む場合、文字コードを意識した以下のような呼び方("<:euc-jp")があるのですが この方法で読み込んだ$datの中身はperlの内部コード(UTF8)になっているということでしょうか? それとも、普通に("<")で読み込んで$dat = Encode::decode("euc-jp", $dat);とすべきでしょうか? use utf8; use Encode; my $fname = "test.txt"; # 文字コードがEUC-JP my $dat = ""; open(IN, "<:euc-jp", "$fname) or die "open error!"; flock(IN, 2); while(<IN>){ $dat .= $_; } close(IN);

    • ベストアンサー
    • Perl
  • viで開くと、utf8で保存した文書が文字化けして読めない

    vine linux4.2を使用しています。 vi(vim?)をutf8で使いたいと思います。どのようにしたらよいでしょうか? まずは、utf8で保存したファイルを読めるようにしたいと思って、今までに試したことは以下です。 */etc/vim/vimrcを~/にコピーして set fileencoding=utf-8 set fileencodings=iso-2022-jp,euc-jp,utf-8,ucs2le,ucs-2,cp932 の行を追加したが、読めなかった。 *evimで起動するとutf8で保存したファイルが開けた(が、モードが使用できないので迷っています)

  • ProFTPd + iconvパッチ CharsetLocal が unknown

    ProFTPd に iconv パッチをあて proftpd.confに CharsetLocal UTF-8 CharsetRemote CP932 この2つの設定をしたところ、 noppi@sv:/usr/local/src$ /usr/local/sbin/proftpd -t Checking syntax of configuration file - Fatal: unknown configuration directive 'CharsetLocal' on line 43 of '/usr/local/etc/proftpd.conf' となってしまいます。 -l で確認するとCompiled-in modules:にはmod_codeconv.cが含まれているので、パッチあてとビルドはできていると思います。 また、Charset系のオプションをはずすと、inet.dから正しく起こされます。 原因や対策などご存知の方、よろしくお願いいたします。 OS:Debian Etch Linux 2.6.22 コマンド: cd /usr/local/src wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.0.tar.gz wget http://www.hakusan.tsg.ne.jp/tjkawa/software/misc/proftpd-iconv/pack/proftpd-1.3.0-iconv.patch.gz wget http://www.hayasoft.com/JP/software/linux/proftpd-1.3.0-nlst-ffftp.patch tar -zxvf proftpd-1.3.0.tar.gz gzip -d proftpd-1.3.0-iconv.patch.gz patch -p0 < proftpd-1.3.0-iconv.patch patch -p0 < proftpd-1.3.0-nlst-ffftp.patch cd proftpd-1.3.0 ./configure --prefix=/usr --with-modules=mod_codeconv:mod_df make make install

  • echo $LANGで何も表示されません。

    現在CentOS4を使用しているのですが、文字コードをUTF-8からEUC-JPに(i18nファイルを設置して)変更し、システムの言語設定を確認したくTera Term Proでecho $LANGと確認したのですが何も表示されません。 初歩的な質問ですがよろしくお願いいたします。 [XXXXXX@localhost ~]$ echo $LANG                 ←何も表示されない。 [XXXXXX@localhost ~]$

  • colinuxで日本語manページがうまく表示されません

    windowsXPにcolinuxをインストールしてDebianを使い、puttyで操作していますがmanページが次のようなメッセージがあり表示されません。 環境変数もLANG=ja_JP.eucJPにしているのですが・・・。 ls(1) を再フォーマットしています。しばらくお待ちください... invalid charset name man: コマンドはステータス 256 で終了しました: (echo '.ll 107n'; /usr/bin/zsoelim /tmp/zmanORg53I) | /usr/bin/tbl | /usr/bin/nroff -mandoc -rLL=107n -rLT=107n -Tascii8 | iconv -c -f ISO-8859-1 -t EUC-JP | exec /usr/bin/pager -s こうなってしまいます、なにがいけないのでしょうか。 またやはりVNCでgnomeも日本語表示されませんが同じ原因にもとづくものでしょうか。

  • File::Findモジュールの例外処理

    サーバー内の入り組んだ階層の中にある全てのhtmlファイルをEUCコードに一括 変換処理したいと考えています。 但し、あるひとつのディレクトリ内とそのディレクト以下の階層にあるhtmlファイルは 処理したくありません。 require "jcode.pl"; use File::Find; find(\&fileProc, './public_html'); sub fileProc { my $fname = $_; return unless -f $_; #### ここに例外処理を書けばいいと思うのですが・・・ return unless /\.html$/; open IN, $fname; open TMP, ">$fname.temptemp"; # 存在しないファイル名 while (<IN>) { &jcode'convert(*_,'euc'); print TMP; } close IN; close TMP; rename "$fname.temptemp", $fname or warn "cannot rename $fname because $! \n"; } どう書けばいいのかよろしくご教授ください。

    • ベストアンサー
    • Perl