2017-03-10 12 views
1

私は壊れた韓国語の文字列を持っています。 これをutf-8文字列として復元します。PHP回復が壊れた英語以外の文字列(iso 8859-1)をutf-8として

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

上記の文字列はフルストリングの一部であり、ファイル内にあります。 ファイルはutf-8で保存され、壊れていない(韓国語)文字もあります。 壊れた文字列はごくわずかです。

お試しください。 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つの壊れた文字が1つの正しい文字を作り出していると考えました。だから私は各壊れた文字とターゲット(正しい)文字の16進コードをチェックアウトした。いくつかの計算を行った。

$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の代わりに各韓国語文字に別の16進数を追加する必要があります。

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

が私の目的のためによく働くようで、JAVAで4

を試してみてください。私はJAVAを知らない。 http://egloos.zum.com/ndba/v/2831611

は、JavaのGetBytesメソッドに相当してみました。5. を試してみてください。それは非常に困難でした。壊れた文字はそれぞれ2バイトです。 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)ここで、

を言った、あなたは1つのエンコーディングでテキストファイルをエンコードし、別のエンコーディングでテキストをデコードした場合に何が起こるかをシミュレートすることができます。試してみてくださいuto-8でスウェーデン文字åäöをエンコードし、次にiso-8859-1でデコードしたり、明伯(簡体字中国語で「理解する」という意味)をutf-8でエンコードして、GB 18030でデコードします。文字:鏄庝集、私は本当に理解できません。

これは私が望むものであり、このサイトの回復は私の壊れた弦を非常によく回復します。 (iso-8859-1からeuc-krまで)ですが、私はのphpで同じ処理をしたいと思います。

答えて

0

mb_convert_encoding()はあなたのためにこれを行うことができるようになります。私のために

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

結果、私はISO-8859-1ファイルにこのPHPを保存したときである:

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

PHPのソースコードをUTF-8として保存しました。

+0

私はいくつかの情報を逃しました。実際には文字列は文字列の一部です。完全な文字列はこのようなものです。ファイルはutf-8で保存され、壊れていない破損文字は通常のutf-8韓国文字が含まれています。 "13440"、 "0c9e940c3bb84"、 "58ad32cd5bedf3d1c5"、 ""、 "{" p ":" 761596 "、" name ":"úμîÇÐ "í°øºÎºÁ½½ÇºÐ"、 "type": " "、" referrer ":" https://search.naver.com/search.naver?where=webkr&sm=tab_jum&ie=utf8&query=%EC%B4%88%EB%93%B1%ED%95%99%EC% 83%9D%EA%B3%B5%EB%B6%80 "、" site_id ":" "}"、 "2017-03-10 08:06:39" –

+0

多くの作業のように聞こえます。文字セットの問題を避けるために、質問のサンプルファイルへのリンクを追加することができます。誰も助けてくれるとは思わない。 – miken32

+0

http://pastebin.com/fkeBs1xLこれは私のファイルのサンプルです。元のファイルを公開することはできません。ごめんなさい。 –

0

自分で答える

壊れた文字はiso-8859-1にありますが、正確ではありません。 バイトに変換してksc5601に再度変換する必要があります 私はマッピングテーブルを使用しています。 ksc5601にはルールがないためです。独自のマッピングテーブルを使用します。 MySQLでは

https://github.com/jihuichoi/convert-iso8859-1-to-ksc5601

0

、それはeucKRのにlatin1のです。たとえば:

ÀϺÎÅͤýは六角C0 CF BA CE C5 CD A4 FDあり、そして
일부터ㆍはおそらく、UTF8のために努力すべきである六角C0CF BACE C5CD A4FD

です:六角EC9DBC EBB680 ED84B0 E3868D

関連する問題