正規表現が正しく動かないソース。
$revers_str="食玩・チョコ";
$revers_str =~ tr/+/ /;
$revers_str =~ s/\&\#([a-fA-F0-9][a-fA-F0-9])\;/pack("C", hex($1))/ego;
require "MyLibs/strcode_hex.cgi";
use Encode;
tracesub("======STRING============= $revers_str");
$sp=" ";
$lists=<<"EOM";
<table cellpadding="5" cellspacing="5" border="1" bordercolor="#666666">
<tr><td>EUC-JP</td><td>S-JIS</td><td>UTF8</td><td>UTF16</td><td>JIS</td><td>文字</td><td colspan=\"2\">実体参照</td><td>HEX</td><td>VAL</td></tr>
EOM
$lines=0;
$list1=$lists;
open(xIN,"codetable.cgi");
while( ($blocks=<xIN>) ){
if($lines>40){
last;
}
$lines++;
$blocks=~s/\n//g;
$blocks=~s/\xd//g;
$blocks=~s/\s+/$sp/g;
@stack=split(/\s+/,$blocks);
$list1.="<tr>";
$list1.="<td>0:".$stack[0]."</td>";
$list1.="<td>1:".$stack[1]."</td>";
$list1.="<td>2:".$stack[2]."</td>";
$list1.="<td>3:".$stack[3]."</td>";
$list1.="<td>4:".$stack[4]."</td>";
$list1.="<td>5:".$stack[5]."</td>";
$list1.="<td>6:".$stack[6]."</td>";
$list1.="<td>7:".$stack[7]."</td>";
# 本来なら $v6=~s/&#([0-9a-zA-Z]);/chr(hex($1))/ge;
# $v65= encode('utf-8', $v6);
# $v66=strcode_conv("utf8N2sjis",$v65);
# で動くはず
$v6=$stack[6];
$v6=~s/\&\#//g;
$v6=~s/\;//g;
$v64=chr($v6);
$v65= encode('utf-8', $v64);
$v66=strcode_conv("utf8N2sjis",$v65);
$list1.="<td>hexstrx:$hexstrx v66:$v66</td>";
$list1.="</tr>\r";
}
close(xIN);
$lists.="</table>";
$list1.="</table>";
# これは、なぜかマッチしない
$v6='ゞ';
$v6 =~ tr/+/ /;
if($v6=~/&#([0-9]);/ ){
$v11=$1;
}else{
$list1.="UNMATCH.";
}
$v64=chr($1);
$v65= encode('utf-8', $v64);
$v66=strcode_conv("utf8N2sjis",$v65);
# $1 取り出しの期待をあきらめて、ポイント切り出して変換するようにした
# これは、正常に動く
$v6="X=(ゞ) Y=(ゞ)";
$v22=strcode_hexStr($v6,0,"sjis");
$list1.="結果は 11=$v11「$v66」v22=$v22";
open(xOT,">c_codetable.cgi");
print xOT $list1;
close(xOT);
# ポイント切り出して変換するモジュール
sub strcode_hexStr
{
local($stI)=$_[0];
local($s )=$_[1];
local($cod)=$_[2]; # uft-8
local($p);
local($e);
local($frn);
local($bck);
local($lst);
local($val);
local($v64);
local($v65);
local($v66);
local($str);
$str=$stI;
if($cod eq ""){
$cod="utf-8";
}elsif($cod eq "sjis"){
$cod="utf-8";
$lst="sjis";
}
if($s eq ""){$s=0;}
$p=index($str,"&#",$s);
while($p>=0){
$p+=2;
$e=index($str,";",$p);
$val=substr($str,$p,$e-$p);
$v64=chr($val);
$v65= encode($cod, $v64);
if($lst ne ""){
$v66=strcode_conv("utf8N2sjis",$v65);
}else{
$v66=$v65;
}
$frn=substr($str,0,$p-2);
$bck=substr($str,$e+1);
$str="$frn$v66$bck";
$p=index($str,"&#",$p);
}
return($str);
}
スポンサーリンク
