오류 :“입력이 올바른 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ín
XML 과 같은 단어를 포함합니다 .
제 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.
'Programing' 카테고리의 다른 글
Windows 배치 스크립트에서 파일 크기를 어떻게 확인할 수 있습니까? (0) | 2020.12.07 |
---|---|
자바 스크립트 함수를 선언 한 후 변경할 수 있습니까? (0) | 2020.12.07 |
C 구조체에서 멤버 숨기기 (0) | 2020.12.07 |
내 열거 형은 클래스 또는 네임 스페이스가 아닙니다. (0) | 2020.12.07 |
Git을 사용하여 이전 diff 커밋을 보려면 어떻게해야합니까? (0) | 2020.12.07 |