저는 자동으로 생성 된 XML 파일이 UTF-8로 인코딩되어야합니다. 대부분 인코딩이 정확합니다. 그러나 제대로 인코딩되지 않은 몇 가지 문자가 있습니다. Emacs에서 파일을 볼 때 \ 370, \ 351을 얻습니다.XML의 혼합 문자 인코딩이 잘못되었습니다.
프로그래밍 방식으로 문자를 감지하는 방법이 있습니까? 나는 PHP를 사용하는 솔루션을 선호하지만 Perl이나 Java의 솔루션 또한 매우 유용 할 것입니다.
저는 자동으로 생성 된 XML 파일이 UTF-8로 인코딩되어야합니다. 대부분 인코딩이 정확합니다. 그러나 제대로 인코딩되지 않은 몇 가지 문자가 있습니다. Emacs에서 파일을 볼 때 \ 370, \ 351을 얻습니다.XML의 혼합 문자 인코딩이 잘못되었습니다.
프로그래밍 방식으로 문자를 감지하는 방법이 있습니까? 나는 PHP를 사용하는 솔루션을 선호하지만 Perl이나 Java의 솔루션 또한 매우 유용 할 것입니다.
:
(^(?:
[\x00-\x7f] |
[\xc0-\xdf][\x80-\xff] |
[\xe0-\xef][\x80-\xff]{2} |
[\xf0-\xf7][\x80-\xff]{3}
)*$)x
인코딩이 잘못된 것은 확실합니까? 이맥스를 사용하는 대신 이진 파일 뷰어를 사용합니다. 문제가있는 위치의 실제 바이트는 무엇입니까?
Java를 사용하면 유효하지 않은 UTF-8 바이트 패턴을 쉽게 감지 할 수 있습니다. 나는 기본 Charset 지원이 그것을 처리 할 지 확신 할 수 없지만, UTF-8은 꽤 간단하다. 나는 보통 유효한 바이트 시퀀스에 대한 참조로 UTF-8 table here을 사용합니다. 당신이 정규 표현식으로 문자열의 UTF-8 다움을 확인할 수 있습니다
당신은 문서를로드 할 때 발생한 오류를 통해 루프 libxml_use_internal_errors 및 libxml_get_errors를 사용할 수 있습니다. 당신이 찾고있는 오류 코드는 XML_ERR_INVALID_CHAR = 9
<?php
$xml = '<?xml version="1.0" encoding="utf-8"?>
<a>
<b>' . chr(0xfd) . chr(0xff) . '</b>
</a>';
libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->loadxml($xml);
foreach (libxml_get_errors() as $error) {
print_r($error);
}
libxml_clear_errors();
인쇄
LibXMLError Object
(
[level] => 3
[code] => 9
[column] => 5
[message] => Input is not proper UTF-8, indicate encoding !
Bytes: 0xFD 0xFF 0x3C 0x2F
[file] =>
[line] => 3
)
감사! 유감스럽게도 이것은 첫 번째 잘못된 문자 만보고하고 절대로 오류에서 복구하지 않습니다. 따라서 나머지 오류는보고하지 않습니다. – notnoop
감사합니다! 이것을 테스트 할 것이고 테스트에 실패하면'utf8_encode'로 값을 감쌀 것입니다. – notnoop