Perlの文字コード変換方法について

このQ&Aのポイント
  • ActivePerl-5.14を使用している場合、Perlの文字コード変換方法について説明します。
  • 古いバージョンのPerlから移行した場合、文字コードの変換方法に注意が必要です。
  • 代替手段としてEncodeモジュールを使用することを検討してください。
回答を見る
  • ベストアンサー

Perlの文字コード変換について

ActivePerl-5.14を使っているのですが、文字コードの変換はどのようにすればいいのでしょうか。 ローカル環境で動かしているのですが、Shift-JISのテキストを読み込んで、EUC-JPに変換したいと思っているのですが、 今まで5.8を使っていたので、Jcodeを使って、&Jcode::convert(\$txt,'euc'); としていたのですが、5.14ですと use Jcode;  の時点でエラーになってしまいます。 use Encode; を使って、 from_to($txt, 'shiftjis', 'euc'); としてみましたが、 from_to($txt, 'shiftjis', 'euc'); のところでエラーになってしまいます。 ActivePerl-5.14ですと、どのように文字コードの変換をすればいいのでしょうか。 どなたか教えてください。 よろしくお願いいたします。

noname#223023
noname#223023
  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.2

use Encode qw(from_to);とするか、 Encode::from_to()とする。 あと'euc'という文字コードも該当なしなので'eucjp'とする。

noname#223023
質問者

お礼

kuroizellさん ご回答ありがとうございました! 教えていただきましたとおりにやってみたら無事に変換されていました!! 本当にありがとうございます! また何かありましたらお願い致します!

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

具体的にはどのようなエラーになるのですか? ひょっとして, 「EUC は日本だけのもの」と思っている?

noname#223023
質問者

お礼

Tacosanさん ご回答ありがとうございます。 文字コードについてあまり知識がないのと、エラーの意味もよく分からなくて申し訳ございませんが、 use Jcode; の行では、下記のエラーになります。 Can't locate Jcode.pm in @INC (@INC contains: C:/site/lib C:/lib .) at xxxxx.pl line 27. from_to($txt, 'shiftjis', 'euc');のところでは、 Undefined subroutine &main::from_to called at xxxxx.pl line 140 というエラーになります。 おわかりになりますでしょうか。 よろしくお願いいたします。

関連するQ&A

  • 文字コード変換

    送信元のページがShift_JISの場合は正常に動作するのですが、 UTF-8等の場合は文字化けしてしまいます。 &jcode'convert(*val, 'sjis'); ↑のものを use Encode; Encode::from_to( $val, "UTF8", "Shift_JIS", Encode::XMLCREF ); このように書いたところ、UTF-8も文字化けしないのですが、 コードを自動的に認識して自動で振り分けさせる方法がわかりません。 サーバーのPerlのバージョンは5.8.6です。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字変換について

    Perlの文字変換について質問があります。 文字コードをJISからShift_JISに変換するには、下記のどれが正しい記述なのでしょうか? ・Encode::from_to($_, "jis", "shiftjis" ) ・encode("shiftjis", $_) ・encode("shiftjis", decode("utf8", $_)) 以上、よろしくお願い致します

    • ベストアンサー
    • Perl
  • perlの日本語文字コードはどうすべき?

    perlで細かいことを理解できないままに呪文のように頭に require 'cgi-lib.pl'; require 'jcode.pl'; を使っていました。 そのうち文字化けなどの問題も出て、いろいろ調べたり質問したりして、jcode.plは古いからJcode.pmを使いなさいと指摘を受けたので、 require 'cgi-lib.pl'; require 'Jcode.pm'; と呪文変更を行いましたが、これについての使い方を理解せぬうちに、use Encode qw(from_to encode);としなさいと指摘を受け、 require 'cgi-lib.pl'; use Encode qw(from_to encode); と変えて使っていました。 ところが、このパターンを使っていたところ、GETでのデータの受渡がうまくできない(internal server error)となることに気づきました。 2つ目のパターンでも同じでした local($key,$val); undef(%in); &ReadParse; my($method) = $ENV{'REQUEST_METHOD'}; if ($method eq "GET"){ $QUERY_DATA = $ENV{'QUERY_STRING'}; }elsif ($method eq 'POST'){ read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'}); }else{ &error; } データの受信はこのようにはじめています。 そもそもJcode.pmやuse Encode qw(from_to encode);というのはjcode.plに変わる日本語変換のパッケージなのでしょうか? また、 require 'cgi-lib.pl'; require 'jcode.pl'; use Encode qw(from_to encode); とするとGETでの受渡も問題なかったのですが、2つを混在させても問題ないのでしょうか? というのも、メール送信で文字変換させるときに sub jis{ my $msg = $_[0]; Encode::from_to($msg, "shiftjis", "iso-2022-jp"); return $msg; } としているので、use Encode qw(from_to encode);がないとEncode::from_to()が使えないのかなと想像し2つをセットで使用しています。(冒頭でuse Encode qw(from_to encode)を宣言し、変換部分でEncode::from_to()を使用) jcode.pl、Jcode.pm、use Encode qw(from_to encode)、Encode::from_to()の関係について教えてください。 もちろん自分でもネットで調べてみましたが、思うように解説してあるところが見つからず困っています。

    • ベストアンサー
    • Perl
  • 文字コードの変換(Shift-JISからUTF8)

    文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを 確認するとShift-JISのままです。 どなたか教えていただけないでしょうか? ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $input_file="input.csv"; my $output_file="output.txt"; open (IN, $input_file) or die "$!"; open (OUT, ">$output_file") or die "$!"; while (<IN>){ chomp ($_); my @data=split(/,/,$_); for(my $i=0;$i<@data;$i++){ $data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換 $data[$i]=~s/\s+//g; print OUT $_; } print OUT "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • Encode.pmで「髙」(ハシゴ高)が文字化けする

    Perl5.8で、EUCで保存されたテキストファイルを読み込み、Shift-JISで保存しようとしてます。 EUCからShift-JISへの変換は、Encode.pmを使用しています。 テキストファイルに「髙」(ハシゴ高 0xFCE2)や「﨑」が入っていた場合、変換されたデータは「?」(0x3F)になってしまいます。 「髙」や「﨑」をPerlを使用してEUCからShift-JISする方法はありませんでしょうか? ====================================== use Encode qw/ from_to /; open IN, "data.txt"; $data = <IN>; close IN; from_to( $data, 'euc-jp','shiftjis'); open OUT, ">data2.txt"; print OUT $data; close OUT; ====================================== 宜しくお願いします。

    • ベストアンサー
    • Perl
  • Perl 文字コードについて

    From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-type: text/plain;charset=\"UTF-8\" Content-Transfer-Encoding: 8bit この時点で、UTF-8を指定しました。 use Encode; use Encode::Guess; Encode::Guess->set_suspects( qw/ euc-jp shiftjis 7bit-jis / ); $name = encode('UTF-8', decode('Guess', $name)); で本文を、UTF-8に変換して送るようなコードを書きました。 これで一応、パソコン、スマホ共に「本文」は文字化けせず送れるのですが、 今度、別の問題が発生してしまったようで、 「件名」が文字化けしてしまうようになりました。 $subject = encode('UTF-8', decode('cp932', $subject)); 件名も、本文と同じように変換コードをしてみたところ、パソコンでは文字化けしませんでしたが「件名」で文字化けしてしまいます。 調べたところ本文と件名では、内容が違い MIMEエンコードを使用するとのことだったのですが、 実際どのように使うのかわからないです。 $subject = encode('ISO-2022-JP', decode('cp932', $subject)); encode('MIME-Header-ISO_2022_JP', $subject) このように記述するとスマホでは文字化けしないのですが パソコンで文字化けしてしまいます。 そこで、件名がパソコンとスマホで文字化けしないようにし、本文はUTF-8で送るようにするにはどのようにすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • 文字コード

    ある変数$aaaに文字列が入ってくるのですが $code = getcode( $aaa ); で文字コードを調べると、asciiと返ってきます。 文字コードをeucに変換したいので Jcode::convert(\$aaa,'euc'); としても文字コードはasciiのままです。 どのようにしたら eucに変換できるのでしょうか?

    • ベストアンサー
    • Perl
  • 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
  • Jcode を使った複数選択値の文字コード変換について

    フォームから受け取った文字コードの処理において、普段下記の通りにしております。 use Jcode; &ReadParse; while(($k,$v)=each %in){ &Jcode::convert(\$v,"euc");} 基本的に元htmlがsjisだろうがutf-8だろうが問題なくeucに変換されているのですが、 複数選択(フォーム側がチェックボックスなどで、NAME値が複数ある場合)された変数だけは、eucに変換されず文字化けしてしまい、肝心の区切り文字である「\0」も消えてしまう状態です。 &Jcode::convert(\$v,"euc");の部分を、$v にしたり *v にしたり色々してみたのですが、複数選択が正しく処理されているときは単一項目がうまくいかなかったりという状態です。 getcodeで調べてみると、複数選択のフォームのコードは ucs2 となっていました。(元のhtmlはeuc。) 試しにvalue値を全て半角英数にしてみたのですが、同じく ucs2 と出ます。(単項目は euc と出ます。) 「\0」が含まれた文字列の変換を行う場合は、何か特別な処理が必要でしょうか?

    • ベストアンサー
    • Perl
  • 機種依存文字の文字コード変換

    現在、Shift-JISでCGIを作成しています。言語はPerlです。HTMLファイルから送信された文字をDBに登録するのですが、CGIをShift-JISで作成しているのに、DBがEUCとなっているため、jcode.plを利用して文字コードを変換しています。 しかし、文字が機種依存文字である場合、jcode.plでは文字コード変換ができないようで文字化けを起こした文字をDBに登録しようとしてエラーを起こしてしまいます。 何とか機種依存文字をコード変換したいのですが、可能でしょうか?

    • ベストアンサー
    • Perl