2017-03-10 3 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 일부터 ㆍ 상세 내용 확인" (I 온라인 변환 사이트에 복구. 사이트 주소 및 기타 정보는이 게시물의 하단에)

입니다

다음 두 깨진 각 문자 하나 올바른 문자를 알아 냈다. 그래서 각 깨진 문자와 대상 (올바른) 문자에 대한 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 진수를 추가해야합니다.

시도 JAVA 4

,

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

내 목적을 위해 잘 작동하는 것 같다. 하지만 나는 자바를 모른다. http://egloos.zum.com/ndba/v/2831611

5. 자바의 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에서 같은 과정을 원한다.

답변

0

mb_convert_encoding() 당신을 위해이 작업을 수행 할 수 있어야한다 : I는 ISO-8859 파일이 PHP를 저장할 때

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

결과 나를 위해, 입니다 :

부산전단지 배포사원 모집. 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하는 라틴입니다. 예를 들어 :

ÀϺÎÅͤý은 진수 C0 CF BA CE C5 CD A4 FD이며,
일부터ㆍ 당신은 아마 UTF8을 위해 노력한다 진수 C0CF BACE C5CD A4FD

수 있습니다 : 진수 EC9DBC EBB680 ED84B0 E3868D

관련 문제