• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:shift-jisをUTF-8に読み込ませるには?)

shift-jisをUTF-8に読み込ませる方法

このQ&Aのポイント
  • 質問者はshift-jisで保存されているCSV形式のテキストファイルからデータを取得し、UTF-8にエンコードしたいという問題に直面しています。
  • 質問者はEncodeモジュールを使用して文字列をエンコードしようとしましたが、文字化けしてしまいました。
  • 質問者はUTF-8で表示するためにはHTMLのmetaタグでcharset=UTF-8を指定する必要があります。

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

  • ベストアンサー
回答No.3

もし、Encode::from_to($_, 'shiftjis', 'utf-8');としても表示がおかしいとしたら、それ以外のところでプログラムが間違っているのでは? 例えば二重引用符やエスケープが出てこない単純なCSV形式のファイルの3番めの要素をとってUTF-8に変換してHTMLとして表示するプログラムはこんな感じで書けますが、これで問題なく表示できると思いますよ。 use strict; use Encode; # ファイルからデータを読み込み my $input_file = "./datas/pdtscrt.txt"; open(my $fh, "<$input_file") or die; my @input_data = <$fh>; close($fh); # CSVの3番目の要素を抽出 my @selected_data = (); foreach (@input_data) { my @cols = split(/\,/, $_); push(@selected_data, $cols[2]); } # 3番目の要素を選び、ShiftJISをUTF-8に変換 my $out; foreach (@selected_data) { Encode::from_to($_, 'shiftjis', 'utf-8'); $out .= $_ . "<br />"; } # HTMLとして出力 print << "__EOM__"; Content-Type: text/html; charset=UTF-8 <!doctype html> <html><head><meta charset="UTF-8"> <body> $out </body> </html> __EOM__ ちなみに、質問にあるコードでちょっとおかしいと思うところはあります。 例えば、 foreach(@Pscrt){ use Encode; Encode::from_to( $_, 'utf8', 'shiftjis' ); $Pscrtfl .= $_; } の$Pcsrtfl .= $_;が何をやりたいのか自分にはわかりません。 これは次のところでファイル名を入れてましたよね? $Pscrtfl = "./datas/pdtscrt.txt"; open (DT,"<$Pscrtfl"); @Pscrt = <DT>; close (DT); あとはCGIで表示するHTTP ヘッダーのContent-Typeなどで宣言しているcharsetが間違っているとかでしょうか。

sintyan0902
質問者

お礼

こんなにも親切にご教示くださり、勉強できました、そしてプログラムも無事稼働しました!! また何かの折にはご教示くださいませ(*^-^*)

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

from_toはdecode→encodeを一気にやってくれますが、 文字列加工するなら decode→加工→encodeとします。 (decode後decode前でないと文字列操作できない。) ================================================== use utf8; #ソースコードはUTF-8で記述 use strict; use Encode; my $Pscrtfl = "./datas/pdtscrt.txt"; # 第2引数で文字コード指定:decode("cp932", $_) を勝手にやってくれる。 open(my $in, "<:encoding(cp932)", $Pscrtfl); my @Pscrt = <$in>; close ($in); #文字列の加工とかはここでやる my $output = join("\n",@Pscrt); # print前にUTF-8に変換、変換するのが面倒なら binmode STDOUT, ":utf8"; my $output_UTF8 = encode('UTF-8', $output); #$output_UTF8 .= "あああ"; #のようにencode前後の文字列を混ぜると文字化けします。 print $output_UTF8; #とりあえずそのまま出力 ================================================== サンプル中にも書きましたが、encode前後の文字列を混ぜると文字化けします。 (encodeした文字列、言い換えるとdecodeされていない文字列の方が勝手にlatin-1文字コードと見なされてdecodeされます。) 詳しいことはEncodeの使い方を調べてみた方が良いと思います。 例えば、 Encode - 日本語などのマルチバイト文字列を適切に処理する http://d.hatena.ne.jp/perlcodesample/20091118/1246679588 Perl 5.8.x Unicode関連 http://www.rwds.net/kuroita/program/Perl_unicode.html

すると、全ての回答が全文表示されます。
回答No.1

マニュアルを見る限り、Encode::from_toの使い方が間違っているようですが... | from_to($octets, FROM_ENC, TO_ENC [, CHECK]) http://search.cpan.org/~dankogai/Encode-2.55/Encode.pm#from_to なので、shift_jisをutf-8にしたいなら、 Encode::from_to($_, shiftjis', 'utf-8'); では?

sintyan0902
質問者

補足

素早い回答ありがとうございます!! ご指摘頂いたようにやってみましたが、やはり文字化けが解消しませんでした。。。。 何が間違ってるんでしょうかねぇ~

すると、全ての回答が全文表示されます。

専門家に質問してみよう