perl

正規表現が正しく動かないソース。

$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/&amp#([0-9a-zA-Z]);/chr(hex($1))/ge; 
        # $v65= encode('utf-8', $v6);
	# $v66=strcode_conv("utf8N2sjis",$v65);
        # で動くはず
	$v6=$stack[6];
	$v6=~s/\&amp;\#//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='&#12446;';
$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=(&#12446;) Y=(&#12446;)";
$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);
}

スポンサーリンク

関連記事一覧