Programing

오류 :“입력이 올바른 UTF-8이 아닙니다. 인코딩을 나타냅니다!”

lottogame 2020. 12. 7. 07:44
반응형

오류 :“입력이 올바른 UTF-8이 아닙니다. 인코딩을 나타냅니다!” PHP의 simplexml_load_string 사용


오류가 발생합니다.

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xED 0x6E 0x2C 0x20

simplexml_load_string타사 소스를 사용하여 XML 응답을 처리하려고 할 때 . 원시 XML 응답은 콘텐츠 유형을 선언합니다.

<?xml version="1.0" encoding="UTF-8"?>

그러나 XML은 실제로 UTF-8이 아닌 것 같습니다. XML 콘텐츠의 언어는 스페인어이며 DublínXML 과 같은 단어를 포함합니다 .

제 3자가 XML을 분류하도록 할 수 없습니다.

XML을 사전 처리하고 인코딩 비 호환성을 수정하려면 어떻게해야합니까?

XML 파일의 올바른 인코딩을 감지하는 방법이 있습니까?


0xED 0x6E 0x2C 0x20 바이트는 ISO-8859-1의 "ín"에 해당하므로 콘텐츠가 UTF-8이 아닌 ISO-8859-1에있는 것처럼 보입니다. 데이터 공급자에게 이에 대해 알리고 수정하도록 요청하십시오. 그것이 당신에게 효과가 없다면 다른 사람들에게도 효과가 없을 것입니다.

이제 문제를 해결할 수 있는 몇 가지 방법 이 있습니다 . XML을 정상적으로로드 할 수없는 경우 에만 사용해야 합니다 . 그들 중 하나는 utf8_encode(). 단점은 해당 XML에 유효한 UTF-8과 일부 ISO-8859-1이 모두 포함되어 있으면 결과에 mojibake 가 포함된다는 것 입니다. 또는 iconv()또는 mbstring을 사용하여 문자열을 UTF-8에서 UTF-8로 변환하려고 시도하고 그들이 해결해주기를 바랍니다. (그렇지 않을 것이지만, XML을로드 할 수 있도록 최소한 유효하지 않은 문자를 무시할 수 있습니다)

또는 길고 긴 길을 택하여 직접 시퀀스를 검증 / 수정할 수 있습니다. UTF-8에 얼마나 익숙한 지에 따라 시간이 걸립니다. 내가 알지 못하더라도 그렇게 할 수있는 도서관이있을 것이다.

어느 쪽이든 데이터 공급자에게 잘못된 데이터를 보내고 있다고 알리면 문제를 해결할 수 있습니다.


다음은 부분 수정입니다. 확실히 모든 것을 고치는 것은 아니지만 일부는 고칠 것입니다. 제공자가 물건을 고칠 때까지 당신이 갈 수 있기를 바랍니다.

function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str)
{
    return preg_replace_callback('#[\\xA1-\\xFF](?![\\x80-\\xBF]{2,})#', 'utf8_encode_callback', $str);
}

function utf8_encode_callback($m)
{
    return utf8_encode($m[0]);
}

나는 이것을 사용하여 해결했다.

$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);

xml이 UTF-8로 인코딩되었지만 잘못된 문자가 포함되어 있다고 확신하는 경우이 함수를 사용하여 수정할 수 있습니다.

$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);

최근에 비슷한 문제가 발생하여 원인이 분명한 것을 찾지 못했습니다. 문자열에 제어 문자가 있는 것으로 밝혀 졌지만 해당 문자열을 브라우저에 출력했을 때 텍스트를 IDE에 복사하지 않으면 해당 문자가 보이지 않았습니다.

이 게시물 덕분에 문제를 해결할 수있었습니다 .

preg_replace ( '/ [\ x00- \ x1F \ x7F] /', '', $ input);


자바 스크립트를 사용하는 대신 mysql_connect 문장 뒤에 다음 코드 줄을 넣을 수 있습니다.

mysql_set_charset('utf8',$connection);

건배.


Firefox에서 타사 XML 소스를 열고 인코딩으로 자동 감지되는 것을 볼 수 있습니까? 아마도 그들은 평범한 ISO-8859-1, UTF-16 또는 다른 것을 사용하고있을 것입니다.

하지만 UTF-8로 선언하고 다른 것을 제공하면 피드가 분명히 손상됩니다. 이러한 깨진 피드를 처리하는 것은 나에게 끔찍한 느낌이 듭니다 (때로는 피할 수 없지만 알고 있습니다).

"UTF-8 대 ISO-8859-1"과 같은 간단한 경우 라면 mb_detect_encoding ()으로 운을 시험해 볼 수도 있습니다 .


예를 들어 메모장 ++에서 XML 파일을 다운로드하고 열면 인코딩이 UTF8이 아닌 다른 것으로 설정되어 있음을 알 수 있습니다. xml에 대해 동일한 문제가 발생했으며 편집기에서 인코딩이 수행되었습니다. :)

문자열 <?xml version="1.0" encoding="UTF-8"?>은 문서의 인코딩을 설정하지 않으며 유효성 검사기 또는 다른 리소스에 대한 정보 일뿐입니다.


I just had this problem. Turns out the XML file (not the contents) was not encoded in utf-8, but in ISO-8859-1. You can check this on a Mac with file -I xml_filename.

I used Sublime to change the file encoding to utf-8, and lxml imported it no issues.


After several tries i found htmlentities function works.

$value = htmlentities($value)

When generating mapping files using doctrine I ran into same issue. I fixed it by removing all comments that some fields had in the database.

참고URL : https://stackoverflow.com/questions/2507608/error-input-is-not-proper-utf-8-indicate-encoding-using-phps-simplexml-lo

반응형