[PHP-users 1710] 外字チェック

DTS 勝亦隆泰 php-users@php.gr.jp
Sun, 02 Sep 2001 21:50:51 +0900


こんにちは。
勝亦 といいます。

PHPで、機種依存文字や外字をチェックする
プログラムを作ろうとしていますが上手くいきません
のでお力をお貸しください。

いろいろ試した結果、以下のような結論になりました。
 (テストでは、SJISの0xF040に外字を定義しました。)

(1) システム外字( まるでかこんだ1など )は、所定の変換方式でEUC-JPに変換される。

(2) ユーザ定義外字は変換されないで、そのままプログラムの
  変数に設定される。
    または、『BAD+F040』や『\0』に変換される。
  動作に違いが起こるのは、文字コードの自動判別
     と関係がありそうですが、入力文字列の先頭にユ
     ーザ定義外字を置くと、変換されないでスルーされ
     ることが多いようです。入力文字列の先頭が普通
     の日本語の場合で途中にユーザ定義外字がある
  場合は、『BAD+F040』や『\0』に変換されやすい
  ようです。『BAD+F040』と『\0』のどちらに変換さ
  れるかは、同じ文字列を入力しても、時に応じて違うようです。


テストはWindows端末から文字をサーバに送信する
ことで行いました。
PHPのバージョンは、4.0.6です。
内部エンコーディングはEUC-JPです。

この動作を変更できませんでしょうか。
よろしくお願いいたします。

--------------------------
コンパイルオプション
--------------------------
./configure \
--with-pgsql=/usr/local/pgsql \
--without-mysql \
--without-msql \
--enable-mbstring \
--enable-mbstr-enc-trans \
--enable-ctype \
--enable-mbregex \
--disable-session \
--enable-calendar \
--with-apxs \
--with-zlib

--------------------------
HTML ( char.html )
--------------------------
<HTML>
<HEAD>
<TITLE></TITLE>

</HEAD>
<BODY>
外字や機種依存文字があるかチェックします。<BR>
外字や機種依存文字がある場合、それを■に変換して表示します。<BR>
半角カナは機種依存文字として認識してないのでそのまま出力されます<BR>
        <FORM action="char.php" method="POST">
                <TEXTAREA ROWS="5" COLS="40" NAME="FREETEXT"
MAXLENGTH="255"></TEXTAREA><BR>
                <INPUT type="SUBMIT" value="送信" name="SUBMIT">
        </FORM>
</BODY>
</HTML>


--------------------------
ソースコード( char.php )
--------------------------
<HTML>
<BODY>

<?
echo "変換前のコード" . bin2hex($FREETEXT) . "<BR>\n";
$length = mb_strlen($FREETEXT);
$output = "";
for($i = 0; $i < $length; $i++){
        $achar = mb_substr($FREETEXT, $i, 1);
        if(preg_match("/([\x8F][\xA1-\xFE][\xA1-\xFE])/", $achar)){
                // echo "コードセット3の場合はsjisで使えない";
                 $output = $output . "■";
        }else if(preg_match("/([\xA9-\xAF][\xA1-\xFE])/", $achar)){
                // echo "コードセット2の中で機種依存文字/外字の部分";
                $output = $output . "■";
        }else if(preg_match("/([\xF5-\xFE][\xA1-\xFE])/", $achar)){
                // echo "コードセット2の未定義領域";
                $output = $output . "■";
        }else{
                $output = $output . $achar;
        }
}
echo "変換後のコード:" . bin2hex($output) . "<BR>\n";
echo "<BR>\n";
echo "**外字や機種依存文字を■で表示します**<BR>\n";
echo "<BR>\n";
echo $output . "<BR>\n";

?>

</BODY>
</HTML>