2009-07-27 4 views
2

저는 자동으로 생성 된 XML 파일이 UTF-8로 인코딩되어야합니다. 대부분 인코딩이 정확합니다. 그러나 제대로 인코딩되지 않은 몇 가지 문자가 있습니다. Emacs에서 파일을 볼 때 \ 370, \ 351을 얻습니다.XML의 혼합 문자 인코딩이 잘못되었습니다.

프로그래밍 방식으로 문자를 감지하는 방법이 있습니까? 나는 PHP를 사용하는 솔루션을 선호하지만 Perl이나 Java의 솔루션 또한 매우 유용 할 것입니다.

답변

3

:

(^(?: 
[\x00-\x7f] | 
[\xc0-\xdf][\x80-\xff] | 
[\xe0-\xef][\x80-\xff]{2} | 
[\xf0-\xf7][\x80-\xff]{3} 
)*$)x 
+0

감사합니다! 이것을 테스트 할 것이고 테스트에 실패하면'utf8_encode'로 값을 감쌀 것입니다. – notnoop

1

인코딩이 잘못된 것은 확실합니까? 이맥스를 사용하는 대신 이진 파일 뷰어를 사용합니다. 문제가있는 위치의 실제 바이트는 무엇입니까?

Java를 사용하면 유효하지 않은 UTF-8 바이트 패턴을 쉽게 감지 할 수 있습니다. 나는 기본 Charset 지원이 그것을 처리 할 지 확신 할 수 없지만, UTF-8은 꽤 간단하다. 나는 보통 유효한 바이트 시퀀스에 대한 참조로 UTF-8 table here을 사용합니다. 당신이 정규 표현식으로 문자열의 UTF-8 다움을 확인할 수 있습니다

0

당신은 문서를로드 할 때 발생한 오류를 통해 루프 libxml_use_internal_errorslibxml_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 
) 
+0

감사! 유감스럽게도 이것은 첫 번째 잘못된 문자 만보고하고 절대로 오류에서 복구하지 않습니다. 따라서 나머지 오류는보고하지 않습니다. – notnoop