- ベストアンサー
表という文字の扱いについて
表という文字は2バイト目が\と同じコードだから注意しろという記事を読みました。その記事では、 print "表示"は文字化けするが print '表示' は問題ないとありました。 なぜなら''で囲むとその中はperlインタプリタが解釈しないからだとありました。 しかしそのあとに、 print "表"もprint '表'も文法エラーになるので注意しなさいとありました。 どうしてprint '表示'では何の問題もないのに、print '表'ではエラーになってしまうのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>\x5cは\と解釈されてしまいエラーになってしまわないのはどうしてなのでしょうか? それは、2度評価されないということですね。 \xhhは、16進で文字コードを表す表記ですが、 \xの部分がそういう解釈をするエスケープだとされますから \x5cは文字コード\と解釈されますが、それは、既に評価した結果であって、それをもう一度文字列の中のエスケープだとは解釈されません。 何度でも、再評価されてしまうのだったら \\の様に、エスケープをエスケープすることができません。
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>print '表'ではエラーになってしまうのでしょうか? 「表」はシフトJISで"\x95\x5c"になっています。 \x5cの部分が、\と同じコードなので、 \x95\'と書いたのと同じになります。 そのために、本来の、文字列の囲みの終端である ' がエスケープされて、文字列中に ' を書きたいからエスケープしているのだと判定されて、文字列の囲みの終端が無いことになって、エラーになります。 print '表\'; (\\にしたことになる) とするか スクリプトの先頭に use encoding 'shiftjis'; と書けば print "表示"; print "表"; print '表'; と書いても大丈夫です。 既に書いていますが、 場合によっては、コードとして print "\x95\x5c"; の様に書くのもありです。
お礼
対策まで提示していただきありがとうございます。 すいません。ちょっとわからないところがあります。 print "\x95\x5c";と書くと問題なく動作するのですが、 この場合、\x5cは\と解釈されてしまいエラーになってしまわないのはどうしてなのでしょうか?
- steel_gray
- ベストアンサー率66% (1052/1578)
シングルクォーテーションで括った文字列の中では\n等のエスケープシーケンスは無効ですが、\'と\\は有効になります。 つまり print '表' は print '‥\' と等価ですので、文字列の終了を示す「'」が見つからないという事になってしまうのです。
お礼
ありがとうございます。理解できました。
お礼
再度のご回答ありがとうございます。とてもためになりました。