首页 » 网站建设 » PHP » 正文

日文汉化|Shift_JIS转Unicode

在日本作者开发的应用程序或者游戏中,大多采用的是Shift_JIS编码(日语编码),

而中文操作系统中大多是用通用性较高的Unicode作为编码,故而采用SHift_JIS编码的软件会显示乱码。

众所周知,计算机中字符由十六进制进行表示。ASCII码一个字符占用两位,Unicode占用四位,Shift_JIS中也是占用四位。

在汉化软件或者游戏的时候,需要对编码进行转换。

用软件Notepad++可以非常方便的批量转换。

而对于常用的exe等二进制软件需要在十六进制上进行逐个修改,故而选用更加专业的十六进制编辑器Winhex(或Ultraedit等)进行修改。

具体转码方法笔者没有研究出来,由于字符是有限的,考虑通过对比字符集可以进行匹配转换。

实现原理就是输入Shift_JIS编码对应的十六进制,从一个包含了Shift_JIS和Unicode对应字符的字符集(charset.txt)中比对输出对应的Unicode的十六进制。

使用惯用的php写的代码:

 

 <?php
$str = $_GET['jis'];
// $str = "0000";
$len = strlen($str);
$i=0;
$j=0;
$in=array();
$out=array();
do{
 $in[$j]=substr($str,$i,4);
 $j++;
 $i+=4;
}
while($i+4<= $len);
// print_r($in);
$charset=file('charset.txt');
$total=count($charset);
$counter=0;
while ($counter<$total)
{
 list($jis,$uni,$char)=explode("|",$charset[$counter]);
 $jis_arr[$counter]=$jis;
 $uni_arr[$counter]=$uni;
 $uni_char[$counter]=$char;
 $counter++;
}
// print_r($jis_arr);
// print_r($uni_arr);
$j=0;
$flag=0;
$counter = count($in);
while($j<$counter){
 for($k=0;$k<$total;$k++){
 if($in[$j]===$jis_arr[$k]){
 $out[$j]=$uni_arr[$k];
 $zifu[$j]=$char_arr[$k];
 $flag=1;
 break;
 }
 }
 if($flag==0){
 $out[$j]='0000';
 $zifu[$j]='空';
 }
 $j++;
 $flag=0;
}
// print_r($out);

echo $str;
echo '|';
foreach($out as $value){
 echo $value;
}
echo '|';
foreach($zifu as $value){
 echo $value;
}
?>

参考资料:

http://baike.baidu.com/view/40801.htm

http://www.chi2ko.com/jingyan/shiftjis2uni.htm

 

发表评论