Windows環境でShift-JISテキストファイルを読み書きする方法とは?

このQ&Aのポイント
  • Perlを使用してWindows環境でShift-JISのテキストファイルを読み込み、UTF-8で書き込む方法についてわかりません。
  • binmode STDOUT, ":utf8"; だけではエラーが発生しました。エラーの意味を理解することができませんでした。
  • 詳しい方にサンプルプログラムを教えていただけると助かります。
回答を見る
  • ベストアンサー

perlをwindows環境でshift-jisのテキストファイルを読

perlをwindows環境でshift-jisのテキストファイルを読み込み、読み込んだファイルをutf-8でファイルを書き込み(改行コードはLF)をする方法がわかりません。 サンプルプログラムを示してもらえると助かります。 書き込みを”binmode STDOUT, ":utf8";”にするだけでは、下記のようなエラーがでました。エラーの意味が良くわかりませんでした。わかれば教えてください。 Malformed UTF-8 character (unexpected continuation byte 0x82, with no preceding start byte) at utf.pl line 7.

  • Perl
  • 回答数3
  • ありがとう数26

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

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.3

質問文に「binmode STDOUT, ":utf8";」と書いておられるので、リダイレクトを使用するのかなと想像しました。 <utf.pl> use open IN => ":encoding(cp932)"; binmode STDOUT, ":raw:utf8"; print <>; コマンドラインから以下のように打てば所望の結果が得られるのではと思います。 C:\>perl utf.pl sjis.txt >utf8.txt >No.2さんへ open時に、:rawを入れればbinmodeを省略できると思います。 open my $in, "<:encoding(cp932)", "sjis.txt"; open my $out, ">:raw:utf8", "utf8.txt"; print {$out} <$in>; close $in close $out;

aakkiirraajp
質問者

お礼

参考になりました。 ありがとうございます。

その他の回答 (2)

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

open でエンコードを指定すれば良いかと。 ------------------------------------------------------ use Encode; open(IN, "<:encoding(sjis)", "sjis.txt") or die "Can't open sjis.txt."; open(OUT, ">:utf8", "utf8.txt") or die "Can't open utf8.txt."; binmode(OUT); # 改行をLFのみにする為 while (my $line = <IN>) { print OUT encode('utf8', $line); # encode は utf8 フラグを外すため } close(OUT); close(IN); ------------------------------------------------------ print OUT encode('utf8', $line); は print OUT $line; としても動作しますが、警告が出ます。 改行コードの変更がなければ、binmode(OUT) も encode('utf8', ・・・) も要らないのですが・・・。 > Malformed UTF-8 character ・・・ スクリプト内にUTF-8として正しくない文字が有るというエラーです。 「use utf8;」を宣言しているにもかかわらず、UTF-8以外の文字コード(Shift_JIS等)でスクリプト自体が記述されている場合などに出ます。 スクリプト自体はUTF-8で書くのが無難です。

参考URL:
http://www.rwds.net/kuroita/program/Perl_unicode.html
  • YkazubonY
  • ベストアンサー率30% (26/86)
回答No.1

use Jcode; $str="シフトJIS文字列"; &Jcode::convert(\$str, 'utf-8'); printf("%s\n", $str);

aakkiirraajp
質問者

お礼

ありがとうございます。下記のようにするとできました。 できれば、Jcodeは速度が遅いイメージを持っているので使用したくないので、別の方法を教えていただければと思います。 use Jcode; $str="シフトJIS文字列"; &Jcode::convert(\$str, 'utf-8'); my $file = "temp.txt"; open $fh, '>', $file or die "Cannot open '$file': $!"; binmode $fh; print $fh $str."\n"; print $fh $str."\n"; close $fh;

関連するQ&A

  • PERLのSHIFT_JISの振る舞いについて

    PERLでプログラムを作る時、SHIFT-JIS形式で長音符(ー)があると、エスケイプしてもエラーが出てしまい困っています。 また、ホームページそのものがSHIFT_JIS形式のため、UTF-8など他の形式を使うと煩雑になるため避けたいと思っています。 エスケイプさせるなど簡単な方法は無いものでしょうか? また、こちらはご存じでしたら教えていただきたいのですが、「¥」マークでエスケイプしてもうまくいかない文字には他にどの様なものがありますでしょうか? ---test.pl---SHIFT_JIS形式---- $| = 1; $test = "\テ\ス\タ\ー"; $test =~ s/\テ\ス\タ\ー/tester/; print $test; エラーを見ると、 Unmatched [ in regex; marked by <-- HERE in m/\テ\ス\タ\ー <-- HERE / at test.pl line 3. とでます。

  • HTMLがSHIFT-JISにならない

    いつもお世話になります<(_ _)> 携帯電話用サイトを作っているのですが、HTMLファイルの最初に <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS"> と設定しても、PCでアクセスした時にUTF-8で表示され文字化けされてしまいます。 HTML自体の文字コードはSHIFT-JISで保存されております。 手元に携帯電話がないので、まだ携帯表示は確認していませんが、スマートフォン(Android)で見ても文字化けしています。 なぜcharsetでSHIFT_JISを指定し、ファイルもSHIFT_JISで保存しているのにも関わらず、UTF-8になってしまうのでしょうか・・・? 同じような現象をご存じのかた、是非ともお力添え下さい。 宜しくお願い致します<(_ _)>

    • ベストアンサー
    • HTML
  • shift_jisとutf-8

    お世話になります。 先日より文字コードのことで、頭を悩ましています。 サイト制作の時に、フルCSSを目指し、他の人が作っていたCSSを利用してDreamweaverで制作を始めました。 その際、文字コードがutf-8になっていたのですが、ブラウザによっては文字化けしていおり、宣言の部分をshift_jisに変更しました。 この部分です。<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> ちなみにDreamwerverではデフォルトの文字コードはshift_jisなので、わざわざ変更しない限り、制作したページはすべてshift_jisで書かれているようです。 また、使わせてもらったCSSのページには一行目に@charset "utf-8";が入っていたのですが、よくわからないのでこの行をはずしてみたところ、CSSの設定が反映されない部分が出てきました。(これが原因かわかりませんが、この一行を入れると直ったみたいで・・) そこで質問なのですが、HTMLの方ではshift_jis、CSSファイルではutf-8という設定でも別にかまわないのでしょうか?(統一しなくてもいいのか?) また、一行目の@charset "utf-8";を省くと問題がありますか? 統一した方がいい場合は、制作したものをすべてutf-8に(またはshift_jisに)するにはどうしたらいいのでしょうか? 別に統一する必要がなければ今回はこのままにして、次回からきちんとしたものを作って行きたいのですが・・ どうぞよろしくお願い致します。

  • EclipseでShift-JISを使用する方法

    PHPの開発でEclipse(確かPDT)を使用しています。通常はUTF-8で開発を行っているのですが、携帯サイトを作るためにShift-JISでファイルを作成する必要が出てきました。 そこで、そのファイルを右クリックで「プロパティ」を選択し、表示されたウィンドの「リソース」の「テキスト・ファイル・エンコード」の「その他」でShift-JISを選択しようとしたところ、Shift-JISがありません。 そこで、このプルダウンにShift-JISを表示させるにはどうすればよいでしょうか? よろしくお願いします。 ちなみにEclipseはVer3.3です。

    • ベストアンサー
    • PHP
  • UTF-8のphpにshift_jisの埋め込み

    shift_jisのcgiを使っています。 shift_jisはもぉ古いとは承知しておりますが、UTF-8への変換が困難なため shift_jisのままで使おうと思っています。 今までは、shift_jisのcgiの結果を一旦 htmlに書きだしたページを、phpファイル内に iframe を使って埋め込みをしておりましたが、 <?php include("http://******.com/hps/*****.cgi?cmd=s&sc=***"); ?> などで、埋め込みが出来ないものかと思案中です。 埋め込み事態は出来ますが、やはり文字化けします。 何か良い方法はないでしょうか。 また、shift_jisの今後は何年後かに使えなくなるとかありますでしょうか。 どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • charset=Shift_JIS

    4つのhtmlを作成し metaタグを以下のように記述しました。 <meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS"> <meta http-equiv="Content-Style-Type" content="text/css"> <link rel="stylesheet" type="text/css" href="css/style.css"> <script language="javascript1.2" src="js/openex.js"></script> <link rel="stylesheet" type="text/css" href="css/style.css"> 2つのファイルが、IEにおいてエンコード(UTF-8)を選択しないと見れません。 オーサリングソフトは、ホームページビルダーV9です。 最初に作成したときは、気づかなかったのですが、設定において ”文字エンコードをmetaタグで指定する”の設定項目を自動にしておりました。 すると 2つのファイルが自動で charsetが、UTF-8になってたようです。 その後設定をSHIFT_JISにし、charset=UTF-8となったところは charset=SHIFT_JIS"には、後で書き換えました。 ページを作成する際、テンプレートを作成して 4つのファイルを作成したはずなんですが、 なぜ こうなってしまったのかが わかりません。 charset=SHIFT_JIS"を指定してるのに なぜUTF-8を選択しないと見れないのでしょう? かなり 困っています。何度もファイルを書き換えましたが、解決しません。わかる方 なにとぞご教示ください。

  • Shift_JISでコーディングされたものをUTF-8にして移設したい

    Dreamweaverで昔作ったShift_JISコードのHTMLファイルが幾つかあり、それらをHTMLも組み込めるCMS的なシステムに移そうとしたところ、コードをUTF-8で作る必要があったため、 <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> に変更してみましたが、レイアウトが崩れまくってしまいます。 ブラウザで再度Shift-JISを選択しなおすとちゃんと表示されるのですが‥。 これを解決する方法はあるのでしょうか。。それとも一からUTF-8として作り直した方がよいのでしょうか‥。 宜しくお願いします。

    • ベストアンサー
    • HTML
  • shift-jisからutf8に変換

    解決に至らなかったので再度お尋ねします。 CGIのコードを見てくださいますか。 http://hotpegasus.bov.jp/mail.txt (必要な部分だけ表示しておりますので、そのままアップしても機能はしません) 改修した箇所は以下のです。 <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"; ↓ sjis関連をutf8に書き換え、jcodeの頭文字をJに書き換え <meta http-equiv="Content-Type" content="text/html;charset=utf8"> &Jcode'h2z_utf8(*contenido) &Jcode'convert(*subject,'utf8'); &Jcode'convert(*infor,'utf8'); &Jcode'convert(*contenido,'utf8'); &Jcode'convert(*res_msg,'utf8'); print "Content-type: text/html;charset=shift_utf8\n\n"; require 'jcode.pl'をuse Jcode;に書き換え ※jcode::" となっている箇所はありません 結果 メールフォームはエラーや文字化けは出なくて成功しましたが、メール受信の際、ThunderbirdPortableメーラーでは全て文字化け(文字エンコーディングは「日本語ISO-2022jp」となっています)、ウェブメールのgmailでは内容は文字化けになっていませんが、タイトルが文字化けになっています。 どこが悪かったのでしょうか? 宜しくお願いします。

    • 締切済み
    • CGI
  • UTF-8でperlを書きたい

     お世話になっております。  これまで開発環境がWinであったこともあって、Shift_JISでperlを書いていたのですが、この度Mac OSXとデータベース関連でPerlを書かなくてはならないのですが、utf8で書くとInternal server Errorになってしまいます。Shift_JISに戻すと作動するのですが…。  いろいろ調べてみたところ、perl v5.8.xではuse utf8; を使わなくても作動するとのことですが…(私のサーバーでは、perl v5.8.8です)なかなかうまく作動してくれません。  改行コードはLFにしているのですが、その他の改行コードをいろいろやってみましたがやっぱり駄目でした。  何か基本的なことを忘れているのかな…と思うのですが、UTF-8で書く際に(または、Shift_JISから移行する際に)注意すべき点はどんなところでしょうか?

    • ベストアンサー
    • 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