• ベストアンサー

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

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

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

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