[PHP-users 1632] \の扱い (was Re: addslashes関数でエンコード)

Akihiro Sagawa php-users@php.gr.jp
Wed, 29 Aug 2001 00:35:45 +0900


こんにちは。佐川です。

以下の引用部分は'office'さんの
"[PHP-users 1612] Re: addslashes関数でエンコード"からのものです。
 >たけです。
 >さらに疑問がでてきたので質問させて下さい。
MLのトピックとはずれますが...

 >他のメーリングリストからの引用で恐縮なのですが、
 >http://www.mysql.gr.jp/mysqlml/msg.cgi?id=3998より
 >
 >>> 例えば、'東十条'という文字列を追加した場合、
 >>> 追加されたデータを見てみると、'東緒'となります。
 >>応急処置としてバックスラッシュ(\)をその字のあとに加えればいいでしょう。
 >>たとえば '東十\条' のように。
 >
 >とあるのですが、自分の環境
(snip)
 >では「東十\条'」とせずとも
 >INSERT INTO test.test1 (str) VALUES('東十条')
 >で問題なく「東十条」とINSERTされます。

まず、東十条をShift_JISのバイト列で表すと、
   東        十        条
0x93 0x8c 0x8f 0x5c 0x8f 0xf0
と、表現されます。
PHPやPerlでは、このようなバイト列としてマルチバイト文字列を扱っています。
# 厳密には違う、という見方もできますが。

0x5cは、\(バックスラッシュ)と、
文字コードが同じなので、それぞれの言語解析器は、
「条」の先頭の0x8fに\がついているのと同じように解釈します。

PHPの言語解析器では、
理解できないエスケープ記号は、そのまま出力するので、
0x93 0x8c 0x8f 0x5c 0x8f 0xf0
というバイトの並びを吐き出します。

一方 他の言語(例えばPerl)の言語解析器では、
英数字の前についた\は、特殊な意味を持ち、
記号の前の \ はその文字をエスケープしている...と解釈され、
0x93 0x8c 0x8f 0x8f 0xf0 (\x5c は \x8fをエスケープしている)
というバイトの並びを吐き出すので、
東緒 
というように見えるのです。
#「緒」の後に\xf0のコードが出力されますが、見えません。
# (本文ではスペース\x20で代用)

PHPとPerlで、
print("\}");
としたときの違いに起因するのです。:)

では。

☆・・・・‥‥‥‥‥‥…‥‥‥‥‥‥・・・・
  佐川  昭宏       mailto:sagawa@sohgoh.net
                  http://pelican.sohgoh.net/
  ・・・・‥‥‥‥‥‥…‥‥‥‥‥‥・・・・☆