PerlでShift-JISでファイル出力する際のUTF8Nの問題

このQ&Aのポイント
  • PerlでShift-JISでファイル出力する際にUTF8Nで出力される問題が発生しています。
  • UTF8NではなくUTF8でのファイル出力を希望しています。
  • 解決方法を教えていただきたいです。
回答を見る
  • ベストアンサー

ファイル出力をUTF8NではなくてUTF8で行いたい

おせわになります。 Shift-JISで記述したPerlで、ファイル出力をしようとしています。 ------------------------------------ #!/usr/local/bin/perl use encoding 'shiftjis'; $hoge="ほげ" open(OUT,">file.txt") binmode OUT; print OUT $hoge; close(OUT); ------------------------------------ 希望はUTF8での出力なのですが、UTF8Nで出力されてしまいます。 どのようにすればいいのかご教授よろしくお願いします。

  • oo40
  • お礼率100% (1/1)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

binmode OUT をしないのなら #!/usr/bin/perl use strict; use encoding 'shiftjis'; my $hoge = 'ほげ'; open OUT, '>:encoding(utf8)', 'file.txt' or die $!; my $bom = "\x{feff}"; #BOM print OUT $bom; print OUT $hoge, "\n"; close OUT; で警告なしにBOMをつけてファイルを作れます。 どうしても binmodeをする必要があるのなら #!/usr/bin/perl use strict; use encoding 'shiftjis'; my $hoge = 'ほげ'; open OUT, '>', 'file.txt' or die $!; binmode OUT; my $bom = "\x{feff}"; #BOM utf8::encode($bom); print OUT $bom; utf8::encode($hoge); print OUT $hoge, "\n"; close OUT; こんなところですか? #utf-8フラグは良くわからん

oo40
質問者

お礼

さっそくのご回答ありがとうございます。 おかげさまでひとつめの方法で無事解決することができました。 なぜそうなるのかはいまいち理解してませんが、おかげで助かりました。 ありがとうございました。

関連するQ&A

  • UTF-8で書かれたHTMLファイルをShift-JISのファイルに変換できない

    #!/usr/bin/perl -w =begin comment OS: Windows XP Perl: Active Perl v5.8.8 スクリプトは「Shift-JIS」で書いています。 日本語処理関係で参考にしているのはもっぱらオライリージャパンの「Spidering Hacks」の付録の翻訳者 による日本語処理の解説です。 http://oshiete1.goo.ne.jp/qa3716434.html の回答に従い、use encoding 'shiftjis'; から use encoding 'cp932'; へ変更している以外は そこに書かれているやり方に従っていると思います。 UTF-8で書かれたHTMLファイルを「LWP::UserAgent」で取得し、それを Shift-JISコードで出力したいと思い以下のコードを実行したのですが、 以下のエラーが出てしまいました。 Parsing of undecoded UTF-8 will give garbage when decoding entities at C:/usr/local/site/lib/LWP/Protocol.pm line 114. このエラーは何が原因なのでしょうか? =end comment =cut use strict; use LWP 5.64; use Encode; use encoding 'cp932'; # http://oshiete1.goo.ne.jp/qa3716434.html の回答に従い、'shiftjis'から'cp932'へ変更。 #use encoding 'shiftjis'; binmode(STDERR, ':raw :encoding(shiftjis)'); my $url = "http://www.audiounion.jp/bin/products/used/A0/-/-/"; my $browser = LWP::UserAgent->new; my $response = $browser->get( $url ); die "cannot get $url:", $response->status_line unless $response->is_success; my $content = Encode::decode('utf8', $response->content); print $content;

  • [perl5.8] SJISから読み込んだ~と

    sjisで書かれたファイルsjis.txtに"~"と一文字だけ 書いて、それをutf8で記述した以下のperlスクリプト で読込み、文字列マッチングをしたのですが、うまく いきません。(ちなみにソース中blockB部分を有効に し、blockAをコメントアウトするとうまくいきます) #=== match.pl =============================== #!/usr/bin/perl use encoding 'utf8'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(utf8)"; binmode STDOUT, ":raw:encoding(shiftjis)"; # === blockA === open(IN, "<sjis.txt"); @lines = <IN>; close(IN); # ============== # === blockB === # $a = "~"; # push(@lines, $a); # ============== for(@lines) {  if (/~/) {   print "WAVEDASH発見\n";  } } #============================================= ※いわゆるWAVEDASH問題に起因してそうだな、  というのはわかりますが、具体的に何が起きて  いるのかが理解できません。 原因や、どうすればこの問題を解決できるか、 ご存知の方、お知恵をお貸しください。

    • ベストアンサー
    • 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
  • [perl5.8] SJISで出力したはずのファイルにutf8フラグが

    1)SJISで以下の2行を含むファイルを作成し、   sjis.txtという名前で保存します。 "ホツカイドウ" "北海道" 2)SJISで以下のスクリプトを作成します。 #=== one.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis.txt'; my $outfile = 'sjis2.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print OU @lines; close(OU); 3)SJIJSで以下のスクリプトを作成します #=== two.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis2.txt'; my $outfile = 'sjis3.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print @lines; close(OU); 4)one.pl を実行し、続いてtwo.plを実行すると 以下のエラーがコマンドプロンプトに表示されます。 #------------------------------------------- D:\zipcode\utf8mondai>two.pl Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "・趣セゑスカ・イ・・セ橸スウ" Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "蛹玲オキ驕・ これは何故なのでしょうか。 エラーメッセージは、printしようとしている 文字列にutf8フラグがついているという意味 らしいです。

    • ベストアンサー
    • Perl
  • HTTP::Request::Common qw(POST);時にソフト表だとエラーになる

    お世話になります。 HTTP::Request::Common qw(POST);を使ってPOSTする際、aaa=> 'あいう',などの日本語はPOST後、データが渡っている事が確認できるのですが、'ソフト表'等の文字列をあえて送ろうとすると、エラーになってしまいます。 記述はShift_JISで行っています。 先生方、ご教授ねがえませんでしょうか。 #!/usr/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use HTTP::Request::Common qw(POST); use LWP::UserAgent; #use open IN => ":utf8"; # 入力をUTF8とする #use open OUT => ":shiftjis"; #use open ":std"; #use Encode; use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'shiftjis'; #binmode STDOUT, ":encoding(utf-8)"; #binmode STDOUT, ":encoding(shiftjis)"; #use open ":encoding(shiftjis)"; #require './jcode.pl'; my $ua = LWP::UserAgent->new; #タイムアウトを設定 $ua->timeout(10); my $req1 = POST 'http://domain.com/test.cgi', [ aaa => 'www1', bbb => "ソフト表" ,#bbb=> 'あいう',だとエラーになりません ]; print $ua->request($req1)->as_string;

    • ベストアンサー
    • Perl
  • Data::Dumper;でダンプ後表示した文字列\x{30fc}...

    お世話になります。 下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか 表示時に日本語の所が\x{30fc}のような文字列になってしまいます。 これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。 どなたかご教授いただけませんでしょうか。 #!/usr/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use XML::RSS; use Data::Dumper; my $rss = new XML::RSS; #表示形式の違いで1と2がある。 $Data::Dumper::Indent = 1; use open IN => ":utf8"; # 入力をUTF8とする use open OUT => ":shiftjis"; #use open ":std"; #use Encode; #use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis'; #binmode STDOUT, ":encoding(utf-8)"; #binmode STDOUT, ":encoding(shiftjis)"; #binmode STDOUT, ":encoding(euc-jp)"; #use open ":encoding(shiftjis)"; # rssをセット。 open my $fh, '< ./test.rss'; my $text = join undef, <$fh>; close $fh; # rssをパース $rss->parse($text); # ひとまず中見を知る為にダンプしてみる print "Content-type:text/html;charset=Shift_JIS\n\n"; print "<html><head>\n"; print "<title></title></head>\n"; print "<body>\n"; print Data::Dumper->Dump([$rss]);

    • ベストアンサー
    • Perl
  • [perl5.8] utf8で文字出力すると文字化けする

    perl5.8で、テキストをunicode(utf8)で出力したのですが、文字化けします。 ソースは以下のとおりです。 -----ソース----- use open OUT => ":encoding(utf8)"; open(OUT, ">utf8.txt"); print OUT "utf8だよ\n"; close(OUT); ----------------- できたファイルはutf8エンコードなのですが、 エディタで見ると「だよ」が文字化けします。 ちなみにフリーソフトで、SJIS形式の「utf8だよ」が 書かれたファイルをutf8に変換すると、文字化けしません。 フリーソフトで生成したutf8ファイルと、 自作perlで生成したutf8ファイルとを バイナリエディタで読込み比較すると 75746638E381A0E382880D0A (フリーソフト) 75746638C282C2BEC282C3A60D0A (自作perl) という差が出ています。 原因がお分かりになる方、知恵をお貸し願えますか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 大容量テキストファイルから任意の部分だけ抜き出すには??

    テキストファイルから任意の部分だけ抜き出したいです。 試行錯誤しているのですが、正直もうお手上げで。。 やることとしては、元ファイルがshiftjisなので、UTF8に変換し、処理を行う感じになると思っています。 ソースは以下のように書き、syntaxOKなのですが、実際に結果を出力するテキストファイルは0BYTEなので訳がわかりません。。 ソースは以下のような感じです。 何かヒントを頂けないでしょうか。 #!/usr/bin/perl use Encode::JP; use warnings; open READ, '<:encoding(shiftjis)', 'テキストファイル名'; open WRITE, '>:encoding(utf8)', 'テキストファイル名2'; while(my $data = <READ>){ ($data,"shiftjis","utf8"); printf WRITE; }; close WRITE; close READ; open PAY, 'テキストファイル名2'; while (<PAY>) { printf if /^"抜き出したい文字列(開始)"$/ .. /^"抜き出したい文字列(終了)"$/ and !/^(?:"抜き出したい文字列(開始)"|"抜き出したい文字列(終了)")$/; };

    • ベストアンサー
    • Perl
  • utf8使用時のフォーム入力文字コード

    use utf8; binmode(STDIN,":encoding(shiftjis)"); をすると、入力時に内部変換がかかり、UTF-8として扱える という認識で使っていたのですが、下記のコードを実行してみると 入力した文字は普通に sjisで表示されます。 binmode(STDIN~ はどのような意味を持つのでしょうか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.hikoboshi.org/perl/doc/encode.html 他、いろいろなサイトで調べてみたのですが、いまひとつ 納得する回答を得ることができません。 //////////////////////////////////////////////////// use utf8; use open 'encoding(utf8)'; binmode(STDIN,":encoding(shiftjis)"); use CGI; print "content-type:text/html; charset=Shift_JIS \n\n"; print <<"EOM"; <form action="xxx.cgi"> <input type="text" name="hoe"> <input type="submit"> </form> ここは UTF-8文字列なので化ける<br> EOM $cgi = CGI->new; print $cgi->param('hoe'); //////////////////////////////////////////////////// 現在は下記のコードで自前で UTF-8に変換しています //////////////////////////////////////////////////// foreach( $cgi->param() ){ my $str = $cgi->param($_); $str = Encode::encode('utf-8', Encode::decode('shiftjis', $str)); $cgi->param( -name=>$_, -value=>$str ); }

    • ベストアンサー
    • Perl
  • Perl出力をUTF-8に指定する方法

    Perlの出力を UTF-8にするため、 binmode FILE, ':utf8'; を指定したり、 open (FILE, ">:encoding(UTF-8)","$file" ) || die "Error opening $file: $!"; でopenしてみたりしたのですが、それぞれ unknown discipline ':utf8' unknown open() mode: というエラーが出てしまいます。Perlは v.5.6.1でWindows XP(英語版)ですが、UTF-8を指定することはできないのでしょうか?

    • ベストアンサー
    • Perl