• ベストアンサー

utf-8のマシンでsjisのデータファイルを読込み、eucでファイルに出力する方法

utf-8のLinuxマシンで、sjis(改行コードCR+LF)のデータファイルを読込み、euc-jp(改行コードLF)でファイルに出力したいのですが、どのようにすればよいでしょうか。プログラム実行前後に入出力ファイルを直接コード変換することは考えておらず、全て一つのプログラム内でやりたいと考えています。 &jcode'convertで変換するのかなと思っているのですが、読込み時・書き込み時のどちらでやるべきなのか、あるいは両方やるべきなのか分かりません。データには、「・」「I,II」などの特殊文字(?)が含まれているので、それらの文字で問題が起きないかなどもちょっと心配です。 また、&jcode'convertでeucに変換すれば、改行コードも一緒にCR+LFからLFに変換されるものでしょうか。 文字コードのことがよく分かっていないので、的外れな質問になっているかもしれませんが、ご教示願います。

  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

perl プログラムを UTF-8 で書くなど、 内部コードを UTF-8 とするなら、入力時に UTF-8 に変換し、 出力時には UTF-8 から外部コードに変換することになります。 jcode'convert で変換してもよいですが、 Encode モジュールを使って明示的に変換するなら use utf8; use Encode; while( my $line = <> ) { $line =~ s/\x0D\x0A$//xms; my $utf8_line = decode('CP932', $line); # anything to do print encode('EUC-JP', $utf8_line), "\n"; } みたいな感じだし、PerlIO による自動変換を行うのなら use utf8; binmode STDOUT, ":encoding(EUC-JP)"; binmode STDIN, ":encoding(CP932)"; while(my $line = <>) { $line =~ s/\x0D\x0A$//xms; # anything to do print $line, "\n"; } みたいな感じです。 文字コードの変換と改行コードの変換は別物なので上の例や jcode'convert では改行コードは自動的には変換されません。 なお jcode'convert はかなり古い書き方になるため、使用されている jcode.pl は UTF-8 には対応していないかもしれません。 Jcode::convert(Jcode.pm) または Encode を使用された方が よいと思います。 また、中黒「・」やローマ数字「I」、「II」などでは問題は起きませんが、 外字である「かっこ株」や「まる1」などは正しく変換されません。

yuri_tti
質問者

お礼

分かりやすくご説明していただきありがとうございます。 t-okuraさんが書かれていたEncodeモジュールについて 自分でも調べてみました。 5.8からはこんなに便利なものがあるんですね。 家には実行環境がないので、明日試してみます。 本当にありがとうございました。

その他の回答 (1)

回答No.2

「utf-8のLinuxマシンで、sjis(改行コードCR+LF)のデータファイルを読込み、euc-jp(改行コードLF)でファイルに出力したい」 という要件を満たすためなら、nkf を使うのが、最も簡単かと思います。 コマンドラインから、 $ nkf --version と実行して、バージョンが表示されれば、nkf を使うことができます。 以下のように実行すれば、 sjis(改行コードCR+LF)のデータファイルを読込んで、 euc-jp(改行コードLF)で出力します。 $ nkf -SeLu data.txt > data_new.txt 元のファイルを残さずに上書きするなら、 $ nkf -SeLu --overwrite data.txt ってな感じで。

yuri_tti
質問者

お礼

具体的なコマンドイメージまで書いて下さいましてありがとうございます。 Linux初心者の私にとってはとても助かります。 nkfについて自分でも調べてみました。 Luオプションをつけると、改行コードも変更してくれるんですね。 文字コードに翻弄され、なかなかプログラミングが進まなかったのですが、これで先に進めそうです。 ありがとうございました。

関連するQ&A

  • eucデータをsjisに変換できない。

    require './jcode.pl'; &jcode::convert(*name,'euc'); レンタルサーバーのMySQLがeucでしかデータを受け取らない ので以上のような形にしてSQL文を投げました。 結果、htmlでsjisにして吐き出す際に取り出すデータもeucで表示されるため変換できないかと悩んでいます。 while( @row = $sth->fetchrow_array() ) { 1jcode::convert(\$row,'sjis'.'euc'); 2jcode::convert(\$row,'sjis'); 3jcode::convert($row,'sjis'.'euc'); と複数試しましたがダメでした。 Perlのバージョンにより違いがあるので、 全ての先頭に&付けて再度試しましたがうまくエンコードできません。 どなたか解決方法をご存知の方、ご教授ください。

  • 第2水準のSJISをEUCに変換するには。

     初めて質問させていただきます。  あるファイルのSJISの漢字を  &jcode::convert(\$list[13],"euc","sjis", "z"); でEUCに変換したのですが、POSTGRACEQLのINSERT実行時、第2水準の漢字を使用しているレコードでINVALID EUC_JPというエラーになってしまいます。  第2水準の漢字を変換する方法があれば教えてください。  お願いします。

    • ベストアンサー
    • CGI
  • スマートに euc ページを sjis にする方法

    euc でかかれた htmlページを sjis にしたいのですが、 私が思いつく方法だと、open で開けて一行一行読み込み jcode::convert(\$input, 'sjis'); とかやって・・・それをまた、別のファイルに 一行一行保存・・・とかくらいしか思いつかないの ですが、もうちょっとマシな方法はないものでしょうか。

    • ベストアンサー
    • Perl
  • ubuntuのようなutf8マシンでsjisを扱う方法について

    perlでwebページを作ってるんですが、ブラウザからサーバーにformで文字が遅れなくて困っています。 1.ブラウザで文字入力 2.perlで取得してsjisに変換。 3.MySQLにその文字列を登録。 ということをしようと思っているのですが、2の段階でsjisに変換できず困っています。 $a=Jcode::convert($a,"sjis","utf8") などと書いてみますがうまくいきません。 どなたかご指南頂けたら幸いです。

  • 文字コードsjisをUTF8に書き換えたい

    CGIの勉強中の者です。 文字コードはSJISで保存しているCGIをUTF8コードに換えるには何が必要でしょうか? HTMLならmeta内をSJISからUTF8に変更し、TeraPadなどのテキストエディタでUTF8に保存すればオッケーなんですが。 CGIの場合はHTMLと違って、換えるには複雑なのでしょうか? CGIプログラムの中では以下の「sjis」を「UTF8」に書き換えし、UTF8で保存しましたけど、文字化けが出てます。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; 宜しくお願いします。

    • 締切済み
    • CGI
  • terapadでEUCがSJISになってしまう

    terapadというエディタで下にあるような内容を記述し、文字コードEUC、改行コードLFで保存しました。ファイル名はcron.shです。 が、再度ファイルを開くと、文字コードがSJISになっています。 原因を指摘していただけますでしょうか。 #!/bin/sh cd /virtual/sample/public_html/mt/ /usr/bin/perl ./tools/run-periodic-tasks echo Future: MT3.11 run-periodic-tasks exit

  • SJIS→EUCに送っても文字化けしない

    htmlは、SJISで作っています。 PHPは、EUCで作っています。 普通は文字化けをするため、mb_convert_encoding関数を用いますが、 なぜか、この関数を使わなくても、文字化けしません。 友人は、有り得ないと言います。 事実、友人PCではmb_convert_encoding関数で文字化けを直してました。 私も友人に同感で、SJIS→SJISやEUC→EUCなら文字化けしないけど、文字コードが違うのです。違うから、mb_convert_encoding関数を使うと、思っているのですが‥‥ 設定が違うのかと思い、友人の、php.iniなどいくつかのファイルを私のPCに上書きしてもらいましたが、変わりませんでした。 こういうことってあるのでしょうか? 文字化けしないなら、mb_convert_encoding関数を使わなくて良いので、楽だと思いましたが・・・ 何かの不具合なら、いざ完成した時、またmb_convert_encoding関数をいれる手間がありますし、どうしようか迷っています。 本には、「文字化けしない場合もある」という記述は一言も書いてありませんでした。 逆に、「文字化けするからmb_convert_encoding関数を用いる」と大きく書いてあるぐらいです。 何かの設定なのでしょうか? ソフトのバージョンも、同じでした。不思議です。

    • ベストアンサー
    • PHP
  • SJIS→UTF-8の文字コード変換

    Perlで、SJISの16進で表記された文字があるのですが、それがうまく表示できません。 Unicodeの16進文字コードだとうまく表記できるのですが…。 以下がスクリプトです。 以下の場合だと。(句点)がSJISだと0x8142で、 その16進文字列を表示したいのですが、実行結果にあるエラーが出てしまいます。 Unicodeだと。は0x3002なのですが、うまく表示できています。 すみませんがよろしくお願いします。 ---------------------------------------- # このファイルの文字コードはSJIS # 改行コードはLF # # 。 SJIS 0x8142 # Unicode 0x3002 # use Jcode; use encoding "sjis"; $a = 0x8142; $a = Jcode->new($a, "sjis")->utf8; printf("句点の表示…%c\n",$a); printf("句点の表示…%c\n",0x3002); ---------------------------------------- 実行結果 "\x{8142}" does not map to shiftjis at test.pl line 14, <DATA> line 846. 句点の表示…\x{8142} 句点の表示…。

    • ベストアンサー
    • Perl
  • "utf8"→ "sjis" の 文字化け・・・

    xml内のデータで utf8でかかれた 文字列中の ~ が XPATHでデータを取得し シフトジスに変換すると Encode::encode ローカルでは ? になり サーバーでは ?のあとに文字化けします。 Jcodeだと Jcode::convert($rValue, "sjis", "utf8"); ローカルでは ?? サーバーでは 〓 になります。 windowsで作った別のそふとや ブラウザ、メモ帳では 正常にxml内のデータで ~  が入っていることは確認できています。 XPATH(findvalue)の値だけを ファイルに書き込んで メモ帳で表示すると 正常に ~ が表示されるので Encode::encode 、Jcode の問題のようなのですが きちんと表示させる方法がわかりません。  なにか 設定をご存じでしたら よろしくお願いします。

    • ベストアンサー
    • Perl
  • 文字コード(EUC->SJIS)についての質問です

    どこに質問して良いのか判断しかねましたので、 今回の開発環境であるVBのカテゴリで質問させていただきます。 さて早速質問ですが、EUC->SJISについてです。 現在あるフリーの.DLLを使ってコード変換をしているのですが、 ある特定の場合に限り、自分の期待通りの結果を返してくれません。 例えば以下のような場合(説明のためアレンジして抜粋)です。 ------------------------------------------------------------------ Dim Euc(6) As Byte Dim Sjis() As Byte Dim szSjis As Integer 'Sjis()のサイズ Euc(0) = 13 Euc(1) = 10 Euc(2) = 13 Euc(3) = 0 Euc(4) = 46 Euc(5) = 0 szSjis = Euc2Sjis(Euc(), Sjis()) '今回使用しているDLL内の関数 ------------------------------------------------------------------ この結果、変換後の値は以下のようになります。 szSjis → 3 Sjis(0) → 13 Sjis(1) → 10 Sjis(2) → 13 このようになり後半が無視されてしまっているような気がするのです。 私が期待している結果としては、46(&H2E)の"."が残ってほしいのですが…。 Euc(4)=0やEuc(6)=0がなにか悪さをしているのでしょうか? 日本語文字コードの知識に乏しいので、的外れな質問かもしれませんが、 このような分野にお詳しい方がいらっしゃいましたら、 どうかアドバイスよろしくお願いします。

専門家に質問してみよう