programing

오류: PHP의 simplexml_load_string을 사용하여 "입력이 올바른 UTF-8이 아닙니다. 인코딩을 표시하십시오!"

megabox 2023. 8. 27. 09:02
반응형

오류: PHP의 simplexml_load_string을 사용하여 "입력이 올바른 UTF-8이 아닙니다. 인코딩을 표시하십시오!"

오류가 발생합니다.

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

다음을 사용하여 XML 응답을 처리하려고 할 때simplexml_load_string제삼자 정보원으로부터.원시 XML 응답은 내용 유형을 선언합니다.

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

하지만 XML은 실제로 UTF-8이 아닌 것 같습니다.XML 컨텐츠의 언어는 스페인어이며 다음과 같은 단어를 포함합니다.DublínXML에 있습니다.

타사에서 XML을 분류하도록 할 수 없습니다.

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

XML 파일에 대한 올바른 인코딩을 탐지하는 방법이 있습니까?

0xED 0x6E 0x2C 0x20 바이트는 ISO-8859-1의 "in"에 해당하므로 UTF-8이 아닌 ISO-8859-1에 컨텐츠가 있는 것 같습니다. 데이터 공급자에게 이 문제에 대해 알려주고 수정을 요청하십시오. 이 문제가 해결되지 않으면 다른 사용자에게도 문제가 되지 않을 수 있습니다.

XML을 정상적으로 로드할 수 없는 경우에만 사용해야 하는 몇 가지 방법이 있습니다.그 중 하나는 사용하는 것입니다.utf8_encode()단점은 XML에 유효한 UTF-8과 일부 ISO-8859-1이 모두 포함되어 있으면 결과에 Mojibake가 포함된다는 것입니다.또는 다음을 사용하여 문자열을 UTF-8에서 UTF-8로 변환할 수 있습니다.iconv()옴브스트링, 그리고 그들이 당신을 위해 그것을 고쳐주길 바랍니다.그렇지는 않지만 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);

javascript를 사용하는 대신 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"?>문서의 인코딩을 설정하지 마십시오. 문서는 검증자 또는 다른 리소스에 대한 정보일 뿐입니다.

저는 방금 이 문제를 겪었어요.XML 파일(내용이 아님)이 utf-8이 아닌 ISO-8859-1로 인코딩된 것으로 나타났습니다.이 기능은 다음을 포함한 Mac에서 확인할 수 있습니다.file -I xml_filename.

나는 Sublime을 사용하여 파일 인코딩을 utf-8로 변경했고, lxml은 문제없이 가져왔습니다.

몇 번의 시도 끝에 HTML 엔티티 기능이 작동한다는 것을 발견했습니다.

$value = htmlentities($value)

제가 직면한 것은 에릭이 제안한 https://stackoverflow.com/a/4575802/14934277 에 의해 해결되었습니다. 그리고 그것은 사실, 당신의 데이터가 인쇄되는 것이 괜찮은지 알 수 있는 유일한 방법입니다.

누구에게나 유용할 수 있는 코드의 평화가 있습니다.

$product_desc = ..;
//Filter your $product_desc here. Remove tags, strip, do all you would do to print XML
try{(new SimpleXMLElement('<sth><![CDATA['.$product_desc.']]></sth>'))->asXML();}
catch(Exception $exc) {$product_desc = '';}; //Don't print trash

그 부분을 주목하세요.

<![CDATA[]]>

XML을 만들 때는 반드시 해당 XML을 전달해야 합니다. 즉, 필드가 CDATA로 포장되어 브라우저에 표시되는 최종 제품입니다.

독트린을 사용하여 매핑 파일을 생성할 때 동일한 문제가 발생했습니다.데이터베이스에 있는 일부 필드의 주석을 모두 제거하여 수정했습니다.

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

반응형