PHP恢复破坏非英语字符串(iso 8859-1)为utf-8

时间:2017-03-10 05:30:08

标签: php string encoding utf-8 iso-8859-1

在这篇文章的最后,我自己写了答案。至少它适用于我。 回购,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월6일부터ㆍ세세내용확인” (我在在线转换网站上恢复了它。网站地址和其他信息在这篇帖子的底部)

然后我发现每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")

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

尝试5。 尝试使用相当于Java的getBytes。但这很困难。破碎的字符各有2个字节。两个破碎的角色做出正确的角色。但正确的字符有3个字节。(可能是因为它在utf-8中)

这意味着我应该做2 + 2 =&gt; 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 中做同样的过程。

3 个答案:

答案 0 :(得分:0)

mb_convert_encoding()应该可以为您完成此操作:

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

对我来说,当我将这个PHP保存在ISO-8859-1文件中时:

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

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

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

答案 1 :(得分:0)

自己回答

破碎的字符在iso-8859-1中但不完全正确。 它应该转换为字节并再次转换为ksc5601 为此,我只使用映射表。因为ksc5601没有任何规则。它使用自己的映射表。

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

答案 2 :(得分:0)

在MySQL中,这是对euckr的拉丁语。例如:

ÀϺÎÅͤý是十六进制C0 CF BA CE C5 CD A4 FD,和 일부터ㆍ为十六进制C0CF BACE C5CD A4FD

你应该努力争取utf8:hex EC9DBC EBB680 ED84B0 E3868D