• ベストアンサー

表という文字の扱いについて

表という文字は2バイト目が\と同じコードだから注意しろという記事を読みました。その記事では、 print "表示"は文字化けするが print '表示' は問題ないとありました。 なぜなら''で囲むとその中はperlインタプリタが解釈しないからだとありました。 しかしそのあとに、 print "表"もprint '表'も文法エラーになるので注意しなさいとありました。 どうしてprint '表示'では何の問題もないのに、print '表'ではエラーになってしまうのでしょうか?

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>\x5cは\と解釈されてしまいエラーになってしまわないのはどうしてなのでしょうか? それは、2度評価されないということですね。 \xhhは、16進で文字コードを表す表記ですが、 \xの部分がそういう解釈をするエスケープだとされますから \x5cは文字コード\と解釈されますが、それは、既に評価した結果であって、それをもう一度文字列の中のエスケープだとは解釈されません。 何度でも、再評価されてしまうのだったら \\の様に、エスケープをエスケープすることができません。

tochanx
質問者

お礼

再度のご回答ありがとうございます。とてもためになりました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>print '表'ではエラーになってしまうのでしょうか? 「表」はシフトJISで"\x95\x5c"になっています。 \x5cの部分が、\と同じコードなので、 \x95\'と書いたのと同じになります。 そのために、本来の、文字列の囲みの終端である ' がエスケープされて、文字列中に ' を書きたいからエスケープしているのだと判定されて、文字列の囲みの終端が無いことになって、エラーになります。 print '表\'; (\\にしたことになる) とするか スクリプトの先頭に use encoding 'shiftjis'; と書けば print "表示"; print "表"; print '表'; と書いても大丈夫です。 既に書いていますが、 場合によっては、コードとして print "\x95\x5c"; の様に書くのもありです。

tochanx
質問者

お礼

対策まで提示していただきありがとうございます。 すいません。ちょっとわからないところがあります。 print "\x95\x5c";と書くと問題なく動作するのですが、 この場合、\x5cは\と解釈されてしまいエラーになってしまわないのはどうしてなのでしょうか?

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

シングルクォーテーションで括った文字列の中では\n等のエスケープシーケンスは無効ですが、\'と\\は有効になります。 つまり print '表' は print '‥\' と等価ですので、文字列の終了を示す「'」が見つからないという事になってしまうのです。

参考URL:
http://www.rfs.jp/sitebuilder/perl/02/02.html#%95%CF%90%94%93W%8AJ
tochanx
質問者

お礼

ありがとうございます。理解できました。

関連するQ&A

  • 文字コード表が文字化けする

    Win7を使用しています。 Photoshopにてテキスト入力をする際、キーボードから入力出来ない文字に割り当てられている文字を入力したかったため、Windows付属の文字コード表から、入力を試みたところ、文字化けしており入力が出来ません。 英数字のみの海外フォントでして、キーボードで入力出来るような英数字は文字化けは起こしていません。Photoshopでも入力が出来ます。 アルファベットを飾るひげ(っていうのでしょうか…?)を入力したかったため、どのキーに当てられていたかも定かではないのですが、文字化け独特の白い長方形が文字コード表にズラリ。 昨日までは問題なく使用出来ました。変わったことと言えば、IllustratorCS6(もちろん公式購入の正規品です)をインストールしたくらいです。 購入したばかりの有料フォントなので非常にショックです。 文字コード表だけがおかしくなることってあるのでしょうか? TTタイプのフォントです。他のフォントも文字コード表が文字化けを起こしているものが一部あります。

  • ヒアドキュメントで表示した、ある特定の全角文字が文字化けする(直接printだとOK)

    Redhat7.3 perl5.6 タイトルの通りなのですが、 ヒアドキュメント中にある特定の文字列(確認できたのは、「表」「申」) をHTML表示すると、文字化けしてしまいます。 print "Content-type: text/html\n\n"; print '<html><head><title>test</title></head><body>'; print << "HTML"; 1:表 HTML print '2:表'; print '</body></html>'; という記述方法ですが、 2の方は正しく表示されるのですが、 1:の方が文字化けして表示されてしまいます。 他の全角文字は問題なく表示されています。 どなたか原因をご存知の方、ぜひともご教授ください。

    • ベストアンサー
    • Perl
  • ソース中の文字列と、DBから取得した文字列を同時に表示すると文字化け

    perl 5.8.6を使用しています。 MySQLから取り出したデータを、ソース中の文字列と同じprint文の中で 表示させようとした場合に文字化けしてしまいます。 文字コードはMySQL, ソースファイルともUnicode(UTF-8)を使用しています。 具体的には $a[0] にデータベースから取り出した文字列が入っているとすると、 ソース中で print "テスト:$a[0]"; とか print <<END_OF_TEXT; テスト:$a[0] END_OF_HTML とすると、$a[0]の部分が文字化けしてしまうのですが、 print "テスト:"; print "$a[0]"; と書くと、文字化けせずに表示されます。 ちょっと日本語を使ったり、データベースから取り出した文字列を使う箇所が多いプログラムなので、ひとつひとつprint文を分けるのは大変なので避けたいです。 何か文字化けしない回避策や、原因について考えられることがありましたら教えていただけると大変助かります。

    • ベストアンサー
    • Perl
  • 【文字コード】外見上は全く同じなのに生の文字コードが異なるのはなぜ?

    文字コードで行き詰まりました。 同じUTF8で全く同じ文字列であるにも関わらず(外見上は全く同じにも関わらず)、2つの生の文字コードが異なるということが起きて、どうしたらいいのかわかりません。 WEBサイトから「あいう」という文字を取り出してきて、そいつの文字コードを、生で表示させました。 すると、 E38182E38184E38186 になります。ところが、perl文の中で$testStr="あいう"; として、そいつを同じように16進数で表示させると、 304230443046 と、違うものになっています。 にも関わらず、「WEBからとってきた文字列」も「perl内で書いた文字列」も両方「Jcode::getcode()」でその文字コードを調べると、utf8になります。 しかも、それら両方とも、print()をすると、同じように「あいう」と表示されます。 「perl内で書いた文字列」の方では、問題なくDBに入れれるのですが、「WEBからとってきた文字列」の方は、文字化けします。 「WEBからとってきた文字列」を「perl内で書いた文字列」のような文字コードに変換するにはどうすればよいのでしょうか? なぜ同じUTF8として認識されているのでしょうか? もう気が狂いそうです。 どなたかお助けください。お願いします。 環境 Ubuntu perl v5.8.8 built for x86_64-linux-gnu-thread-multi 以下は詳しいソースです。 use utf8;#この質問に関係がありそうなモジュールです use Jcode; use DBI; use URI; use YAML; use Switch; use Web::Scraper; use HTTP::Request::Common; use LWP::UserAgent; use HTTP::Cookies; use HTTP::Request::Common qw(POST); ##Webサイトから文字列「あいう」を取得してくる。取得過程は略してます。 $testStrFromWeb=@titleArr[$i];#ちなみにWebサイトの文字コードはUTF8です。 print("testStrFromWeb:".$testStrFromWeb);#「あいう」と表示されます。 ##Webサイトから得た文字列「あいう」の生の文字コードを表示。 $strCode=$testStrFromWeb; $strCode =~ s/(.)/sprintf "%X", ord($1)/eg; print "$strCode\n";#E38182E38184E38186と表示されます ##Webサイトから文字列「あいう」の文字コードの種類を表示(utf8が返ってくる) my $getcode = Jcode::getcode(\$testStrFromWeb); print $getcode ,"\n";#utf8と表示される ##perl内で書いた文字列。 $testStrInPerl="あいう"; print("testStrInPerl:".$testStrInPerl);#「あいう」と表示されます。 ##perl内で書いた文字列「あいう」の生の文字コードを表示。 $strCode=$testStrInPerl; $strCode =~ s/(.)/sprintf "%X", ord($1)/eg; print "$strCode\n";#304230443046と表示されます ##perl内で書いた文字列「あいう」の文字コードの種類を表示 my $getcode = Jcode::getcode(\$testStrInPerl); print $getcode ,"\n";#utf8と表示される ここまで読んでくださってありがとうございます。

    • ベストアンサー
    • Perl
  • ”ァー”が含まれている文字を置換すると文字化け

    OS:solaris8 perlのver:5.8.6 perlで、”ァー”が含まれている文字列に対し、 全角スペースを半角スペースに置換しようとすると 文字化けしてしまいます。 (”ぁー”でもどうようでした) ”ぃー”や”ぅー”、”ぁ”では 問題無いのですが…。 当方、perl初心者&文字コードに詳しくないため、 原因がよくわからないでいます。 どなたか原因をおわかりの方、 ご教授お願いいたします。 文字コードはEUCです。 以下はソースです my $line = "ファイヴァー スコープ 眼鏡"; $line =~ s/\t/ /g; # タブを半角スペースに置換する print '$line2='.$line."<br>\n"; $line =~ s/ / /g; # 全角スペースを半角スペースに置換する print '$line3='.$line."<br>\n"; #↑ここで文字化けしてしまいます $line =~ s/^\s+//; # 頭の空白を除く print '$line4='.$line."<br>\n"; $line =~ s/\s+$//; # 尻の空白を除く print '$line5='.$line."<br>\n";

    • ベストアンサー
    • Perl
  • DBD::mysqlで「表」という文字をテーブルへインサートしたい

    お世話になります。 環境は windows2000pro perl 5.8.8 mysql 5.0.22 です。 mysqlの文字コード関連の設定はmy.iniにてsjisに統一してあります。 DBIを使って、perlスクリプトからmysqlのテーブルへ「表」という文字をインサートしようとするとエラーになります。mysqlクライアントからならちゃんと「表」もインサートできました。 エラーは以下のようになっています。 「 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''表\')' at line 1表 」 とにかくインサートしようとする文字列の最後の文字が「表」なら同様のエラーになります。 「表示」なら問題なくインサートできます。表の2バイト目が5cなのがまずいと思うのですが、どう対処すればよいかわかりません。 ヒントを下さい。よろしくお願いします。 ----- use strict; use DBI; use Encode qw(from_to); my $str = "表"; from_to($str,'utf8','shiftjis'); eval { my $dbh = DBI->connect( 'dbi:mysql:test,hostname=localhost', 'root','bnogl399',{ RaiseError => 1, PrintError => 0}); $dbh->do("set names sjis"); $dbh->do("use mydb"); $dbh->do("insert into foo values (3, " . $dbh->quote($str) . ")"); $dbh->disconnect(); }; print $DBI::errstr if $@;

  • 文字を一文字ずつ区切りたい

    こんにちは、Perl始めて3か月ほどの大学生です。よろしくお願いします。 Perlにおいて「あいうえお」という文字列があればそれを配列に分けて入れることが最終目標です。 C言語出身なのでPerlにおける配列の概念がよくわからないのですが $word[0]に「あ」、$word[1]に「い」となるように もしくは@word[0][0]に「あ」、@word[0][1]に「い」となるようにしたいのです 自分なりに調べてみて $lineに「abcde」が入っているとすると my @word; $word[0] = substr($line,0,1);とした場合 print $word[0]."\n"; はうまく「a」を出力することができました しかし $line = 'あいうえお'; とすると空白になってしまいました。 したがって @word = spline(/ /,$line); foreach(@word){ print $_."\n"; } を試しました 出力結果は abcde とどうもうまく分けられていないようでした。 環境はよくわからないのですが WindowsXPでputtyjp.exeというものを使ってサーバーにアクセスしていて サーバーはLinuxのRedHatでした 日本語コードは[euc]になっていました use uft8; をすると出力時に文字化けを起こします。 手詰まりになってしまいました。解決の糸口となるヒントがあれば教えて下さい。 2バイトごとに無理やり区切ることも考えましたがバイトごとに区切る方法が分からないのとアルファベットは1バイトのような気がするのでやり方がわからなくなっています。 ご指導のほど、よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl/Tk使用時のUTF-8コード文字の表示

    Windows98SE上でActivePerl5.8.0使用です。  #Perlはここ数年愛用していますが、Tkは数日手をつけただけの初心者です 例えば、  print OUT "☆ Hi! ★\n" ; #☆★はUTF-8 のようにファイルにUTF-8コードで書き出すことは可能ですが、 Tkを用いてWindowにUTF-8コードの文字を表示させようとすると失敗します。 例えば、Windowのタイトルを  $top -> title('☆test1★') ; #☆★はUTF-8 とすると、表示は「笘・est1笘・」と文字化けしてしまいます。 Perl/Tkで作成したWindow上でUTF-8コードの文字を表示させる方法は無いでしょうか?

    • ベストアンサー
    • Perl
  • 文字の数え方

     use utf8; を宣言すると、内部に記述されるリテラルにutf8フラグが立てられて、例えばlengthを用いて文字数を数えた場合に、多バイト文字であっても1文字を1とカウントしてくれるそうです。 次のコードでは、文字列の文字数を数えてみました。。   #! /usr/bin/perl   use utf8;   use Encode;   my $str="最初にUTF-8で表示します。次にshift-JISで表示します。";   print length $str;   print "\n";   $str=encode("shiftjis",$str);   print length $str;   print "\n"; 実行結果は以下の通りです。   33   52 文字列がUTF-8の場合は、シングルバイト文字、多バイト文字関係なく1文字で計算するので33文字です。これに対してshift-JISの場合は、多バイト文字を2文字でカウントするので52文字になります。 なるほど。 しかし、次がよく分からないんですけど、   use utf8; をコメントではずすと、その実行結果は以下のようになりました。   71   76 これはどういう計算なのでしょうか?

    • ベストアンサー
    • Perl
  • 文字コード表でエラー

    Windows XP SP2、Dynabook CX/2213CMSW の環境下で、文字コード表を開こうとすると「問題が発生したため、charmap.exeを終了します。ご不便をおかけして申し訳ありません。」のダイヤログがでて開くことができません。夕べは外字エディタで作成して、文字コード表のフォントボックスの「全フォント(外字)」をクリックしたらこのエラーが出たのですが、今は文字コード表を開くこともできません。マイクロソフトのページで検索しましてもよくわかりませんでした。何かバグでもあるのでしょうか。 よろしくご教授下さい。