ISO 8859 1 个八进制返回正常字符


ISO 8859 1 octal back to normal characters

>我目前正在将我们的旧项目数据库转换为新格式/新数据库。有一些旧数据,可能是由智能手机应用程序转义的。现在条目如下所示:

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;
        }
    ?>