正規表現が正しく動かないソース。
$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); }
スポンサーリンク