[PHP-users 1630] Re: addslashes関数でエンコード
Akihiro Sagawa
php-users@php.gr.jp
Wed, 29 Aug 2001 00:11:42 +0900
こんにちは。佐川です。
以下の引用部分は'office'さんの
"[PHP-users 1610] Re: addslashes関数でエンコード"からのものです。
>たけです。
>佐川さん、コメントありがとうございます。
(snip)
>addslashes関数をaddslashes_ext2にかえればよいみたいなのですが、
>> (3) 自作のaddslashesを作成する
>これにあたるわけですね。(自作ではないですがf^^;)
正確には、(3')かな。(それを意識してその項目をつくったので))
>そこでaddslashes_ext2の関数をいろいろと利用してみたのですが、
(snip)
>「能」の場合では「能\」となってしまうので、
(snip)
>これはaddslashes_ext2側の問題となるのでしょうか?
バグです。ごめんなさい。_o_
さらに、'十ソ'のように間違ってエスケープする文字が連続している場合も正しく
扱うことができませんでした。
バグつきのままでは、(自分でも)不便なので、バグ修正版を作りました。
これは、\xffで日本語一文字ずつに区切って、
addslashesを行うようにしたものです。
でも、{mb,j}stringで一旦別のエンコードにした方が速いと思いますよ。
# あ、J-Skyで使われる絵文字の文字列を壊しちゃうのかな。
バグの報告ありがとうございました。
以下訂正版のaddslashes_ext3です。
コピー&ペーストしてご自由にお使いください。:)
PHP4,3いずれでも動作すると思われますが、
このスクリプトは無責任・無保証とさせていただきます。
使用者の責任においてのみご利用ください。
<?php
function addslashes_ext3($sjis) {
/*
* 機能: 区切り文字(\xff)を入れて、ASCIIのみをaddslashesする。
* 警告: 区切り文字が$sjisに含まれていた場合の動作は保証外。
* 注意: ereg_replaceは\x00をサポートしていないことがあるので、
* \xffを使う。preg_replaceは、\x00をサポートしている。
*/
// 文字コードの範囲
$sjis_high = "[\x81-\x9f\xe0-\xfc]";
$sjis_low = "[\x40-\x7e\x80-\xfc]";
$ank = "[\x01-\x7f\xa0-\xdf]";
// とりあえず、addslashesしちゃう
$escaped = addslashes($sjis);
// 問題が発生する文字列があるか調べる
if (ereg("($sjis_high\\\\)\\\\", $escaped)) {
// 問題がありそう。一文字ずつに分解する。
$raw_char =
$esc_char = explode("\xff",
ereg_replace("(${sjis_high}${sjis_low}|$ank)",
"\\1\xff", $sjis));
// 一文字ずつしらべる
for($i=0; $i<count($raw_char); $i++)
if (strlen($raw_char[$i]) == 1)
$esc_char[$i] = addslashes($raw_char[$i]); // ASCIIのときはaddslashes
// くっつける
$escaped = implode("", $esc_char);
}
return $escaped;
}
/* テスト */
echo addslashes_ext3("能\");
では。(長くてごめんなさい)
☆・・・・‥‥‥‥‥‥…‥‥‥‥‥‥・・・・
佐川 昭宏 mailto:sagawa@sohgoh.net
http://pelican.sohgoh.net/
・・・・‥‥‥‥‥‥…‥‥‥‥‥‥・・・・☆