>我目前正在将我们的旧项目数据库转换为新格式/新数据库。有一些旧数据,可能是由智能手机应用程序转义的。现在条目如下所示:
Tak hur'341 v posteli po pr'341ci a jde se sp'355nkat
现在,真正的条目应如下所示:
Tak hurá v posteli po práci a jde se spinkat
还有像
Som nen''355 ja len chodiaca kapuc''341 pra''u0161iva ignorujuca
这似乎不像ISO 8859 1,尤其是''u0161
部分。
对我可能用来将其转换回可读版本的任何 PHP 函数有什么想法吗?谢谢!
简单的解决方法:
第一个字符串只有八进制 iso-8859-1,而第二个字符串是双斜杠 iso-8859-1,混合了 utf-16 字符(为什么?现在这就是问题所在)。下面的代码采用八进制代码,转换为十六进制,将它们打包为二进制并编码为 utf-8。utf-16 代码已经是十六进制,因此它们只打包并编码为 utf-8。
有关字符集的未来信息参考:http://www.fileformat.info/info/charset/index.htm
<?php
$string = "Tak hur'341 v posteli po pr'341ci a jde se sp'355nkat";
$string2 = "Som nen''355 ja len chodiaca kapuc''341 pra''u0161iva ignorujuca";
print decode_str($string2)."<br>";
print decode_str($string);
function decode_str($string){
return utf16_to_utf8(iso_to_utf8($string));
}
function iso_to_utf8($string){
preg_match_all('#''''[0-9]{3}#',$string,$matches);
foreach($matches[0] as $match){
$char = preg_replace("#(''')#","",$match);
$a = pack("H*" , base_convert($char,8,16));
$string = preg_replace('#('''')'.$char.'#',$a,$string);
}
return mb_convert_encoding($string,"UTF-8","ISO-8859-1");
}
function utf16_to_utf8($string){
preg_match_all('#'''u[a-z0-9]{4}#',$string,$matches);
foreach($matches[0] as $match){
$char = preg_replace("#''''u#","",$match);
$a = pack("H*" , $char);
$a = mb_convert_encoding($a,"UTF-8","UTF-16");
$string = preg_replace('#'.preg_quote($match).'#',$a,$string);
}
return $string;
}
?>