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