PHP恢复损坏的非英语字符串(ISO 8859-1)为UTF-8



在这篇文章的末尾,我自己写了答案。至少对我来说很好。和仓库,https://github.com/jihuichoi/correct-broken-korean-iso8859-1-to-utf8

= = = = = =

我的韩国绳子骨折。我想将其恢复为UTF-8字符串。

$str = '"3234", "ºÎ»êÀü´ÜÁö ¹èÆ÷»ç¿ø ¸ðÁý.  2¿ù6ÀϺÎÅÍ ¤ý»ó¼¼³»¿ëÈ®ÀÎ", "2017-03-02 11:12:34';

上面的字符串是完整字符串的一部分,并且位于文件中。该文件保存在UTF-8中,并且也具有非破裂的(韩语)字符。

只有很少的字符串。

尝试1。mb_convert_encoding,ICONV不起作用。因为

print_r(mb_detect_encoding($str));
result : UTF-8

尝试2。试图将字符串分开并一一转换。

$result = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
var_dump($result);
result : 
array(52) {
  [0]=>
  string(2) "º"
  [1]=>
  string(2) "Î"
  [2]=>
  string(2) "»"
  [3]=>
  string(2) "ê"
  [4]=>
  string(2) "À"
  [5]=>
......

尝试3。我不知道发生了什么事。所以我再次尝试。

上面的字符串实际上是"부산전부산전배포。(我在在线转换站点上恢复了它。网站地址和其他信息在本文的底部)

然后,我发现每个2个损坏的字符都有一个正确的字符。因此,我检查了每个损坏字符和目标(正确)字符的十六进制代码。并进行了一些计算。

$str = 'ºÎ'; //부
$var = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
var_dump($var);
$tmp_str = ''; $result = '';
for($i = 0; $i < count($var); $i++)
{
    if(($i+1)%2 == 1) {
        $tmp_str .= dechex(_uniord($var[$i]));
    } else {
        $tmp_str .= dechex(_uniord($var[$i]));
        $uni2 = dechex(hexdec($tmp_str) + hexdec('EAFBB2'));
        $result .= hexToStr($uni2);
        $tmp_str = '';
    }   
}
echo $result;
result : 부

它有效!但它仅适用于"부"。我应该为每个韩国角色而不是EAFBB2添加另一个十六进制号。

尝试4

在Java中,

new String(XXX.getBytes(8859_1), "euc-kr")

似乎适合我的目的。但是我不知道爪哇。http://egloos.zum.com/ndba/v/2831611

尝试5。用相当于Java的GetBytes进行了尝试。但这非常困难。破碎的角色每个都有2个字节。两个损坏的角色是正确的。但是,正确的字符具有3个字节。(可能是因为它在UTF-8中)

这意味着我应该做2 2 => 3 ???

$str = 'ºÎ'; //부
for($i = 0; $i < strlen($str); $i++){
    $bytes[] = ord($str[$i]);
}
print_r($bytes);
Array
(
    [0] => 194
    [1] => 186
    [2] => 195
    [3] => 142
)
$str = '부'; //부
for($i = 0; $i < strlen($str); $i++){
    $bytes[] = ord($str[$i]);
}
print_r($bytes);
Array
(
    [0] => 235
    [1] => 182
    [2] => 128
)

请帮助我。我有很多骨折,我需要恢复它们。

在线转换网站(http://string-functions.com/encodedecode.aspx)说,

在这里,您可以模拟如果您用一个编码编码文本文件,然后用不同的编码解码文本。尝试例如用UTF-8编码瑞典字符ÅäöÅäö,然后用ISO-8859-1对其进行解码,或者尝试用UTF-8编码明伯(简化中文含义"理解"),并用GB 18030进行解码。这将产生角色:鏄庝鏄庝,我真的不明白。

这就是我想要的,这个网站很好地恢复了我的折断字符串。(iSO-8859-1至euc-kr),但我想在 php 中进行相同的过程。

mb_convert_encoding()应该能够为您做到这一点:

<?php
$line = 'ºÎ»êÀü´ÜÁö ¹èÆ÷»ç¿ø ¸ðÁý.  2¿ù6ÀϺÎÅÍ ¤ý»ó¼¼³»¿ëÈ®ÀÎ';
$line = mb_convert_encoding($line, "UTF-8", "EUC-KR");
echo "$linen";

对我的结果,当我将此PHP保存到ISO-8859-1文件中时

부산전단지 배포사원 모집.  2월6일부터 ㆍ상세내용확인

当我将PHP源代码保存为UTF-8时,我得到了:

쨘?쨩챗?체쨈??철 쨔챔?첨쨩챌쩔첩 쨍챨?첵.  2쩔첫6??쨘??? 짚첵쨩처쩌쩌쨀쨩쩔챘?짰??

在mysql中,即latin1到euckr。例如:

ÀϺÎÅͤý是hex C0 CF BA CE C5 CD A4 FD
일부터ㆍ是HEX C0CF BACE C5CD A4FD

您可能应该为UTF8而努力:HEX EC9DBC EBB680 ED84B0 E3868D

我自己回答

损坏的字符在ISO-8859-1中,但不完全是。它应转换为字节并再次转换为KSC5601为此,我只使用一个映射表。因为KSC5601没有任何规则。它使用自己的映射表。

https://github.com/jihuichoi/correct-broken-korean-iso8859-1-to-utf8

最新更新