[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/
・・・・‥‥‥‥‥‥…‥‥‥‥‥‥・・・・☆