2011-01-12 5 views
3

인코딩 태그가 'utf-8'로 설정된 XML이 있습니다. 그러나 실제로 iso-8859-1입니다.XML 인코딩 수정하기

프로그래밍 방식으로 어떻게 이것을 펄과 파이썬에서 어떻게 감지합니까? 다른 코딩으로 어떻게 디코딩합니까?

펄, 나는

$xml = decode('iso-8859-1',$file) 

을 시도했지만,이 작동하지 않습니다.

+1

구문 분석에 실패한 샘플 XML 파일이 있습니까? 선언 된 인코딩과 "실제로는"사이에 혼란스러워지기 시작했습니다. –

답변

4

무작위 이진 데이터는 많은 인코딩에서 유효한 문자열을 나타내는 경우가 많으므로 남용은 악명이 높습니다.

Perl에서 시도해 볼 수있는 가장 쉬운 방법은 utf-8로 디코드하고 실패를 확인하는 것입니다. (만 원이 방식으로 작동, 수정 UTF-8 인코딩 서양 언어의 문서는 거의 항상뿐만 아니라 유효한 ISO-8859-1 문서입니다)

my $xml = eval { decode_utf8($file, FB_CROAK) }; 
if ([email protected]) { is_probably_iso-8859-1_instead } 

지금 문제를 발견했습니다, 당신은있어 그것을 해결할 수 있습니다. 이것은 대개 사용중인 파서 라이브러리에 따라 다르지만 일부 제네릭을 적용해야합니다.

XML 선언이나 MIME 유형이 없다면 Perl 기본 인코딩이 사용되므로 복사 한 코드가이 트릭을 수행해야합니다.

잘못된 XML 선언이있는 경우 XML 디코딩 라이브러리가 제공하는 모든 기능을 사용하여 XML 선언을 무시하거나 수동으로 대체하여 전달할 수 있습니다.

, 당신의 파일을 엽니 다 문자열로 원시 바이트를 읽어

# assuming it's on line 1: 
$contents =~ s/.*/<?xml version="1.0" encoding="ISO-8859-1"?>/; 
+0

감사합니다. JB. 나는 perl을 위해 simpleXML을 사용하고있다.인코딩이 utf-8로 설정되어있을 때 위 코드를 사용할 때 디코딩되지 않습니다. 이견있는 사람? – vkris

+0

들어 본 적이 없으며 PHP 라이브러리와 혼동하기 쉽습니다. 직접 연결 되시겠습니까? –

+0

(1) "utf-8로 인코딩 된 서양 언어 문서는 거의 항상 유효한 iso-8859-1입니다."사실 ... ** 모든 파일 ** (모든 언어, 인코딩)은 "성공적으로" iso-8859-1로 디코드 (종종 의미있는 것은 아님). (2) XML 선언이 없으면 파서는 UTF-8을 사용해야합니다. 다른 것은 XML 스펙에 위배됩니다. –

1

일반적인 절차에 상관없이 어떤 언어 변함 없을 것이다.

유효한 UTF-8이 아닌 경우 오류를 검사하거나 예외를 발생시키는 옵션을 사용하여 raw_bytes를 UTF-8로 디코딩하려고합니다.

합법적 인 길이의 의미있는 유니 코드 텍스트 파일이 ISO-8859-1로 성공적으로 인코딩되면이 UTF-8 테스트를 통과 할 확률은 매우 낮습니다 (물론 ASCII가 ISO-8859- 1 및 UTF-8).

테스트가 실패하면 XML 선언이 있으면 제거하십시오. 앞자리 :

<?xml version="1.0" encoding="ISO-8859-1"?> 

그런데 실제로 (Windows 플랫폼에서) CP1252 데이터가 아닌 ISO-8859-1 데이터를 갖고 계십니까?

+0

인코딩을 iso-8859-1로 변경했을 때 perl/python 코드를 읽을 수있었습니다. 그것의 리눅스, 그래서 나는 그것이 CP1252가 아닌지 확인할 수 있습니까? – vkris

+0

btw, 맞습니다. 2 가지 옵션이 있습니다. 1. xml의 인코딩을 변경하려면. 나는 (http://code.google.com/p/java-xmlbuilder/)를 사용하고 있는데, 인코딩을 변경하는 방법을 모른다. 2. 잘못 인코딩 된 xml을 ISO-8859-1로 디코딩해야합니다. 어느 디코딩을 사용하여 노력하고 있어요 (펄에서) – vkris

1

물론 데이터 손상의 근본 원인을 찾아서 수정하는 것이 이벤트 발생 후 손상을 검색하고 복구하는 것보다 낫다는 것은 자명합니다.

그 외에도 만드는 주요 포인트는 파일이 XML이 아니므로 XML 도구를 사용하여 수정할 수 없다는 것입니다. 캐릭터 나 바이너리 레벨에서 공격해야합니다. 다른 사람들이 말했듯이, 1 단계는 유효한 UTF-8이 아닌 것을 감지하는 것입니다. 2 단계는 잘못된 XML 선언을 제거하고 올바른 XML 선언으로 대체하는 것입니다. 어느 쪽도 특히 어렵지 않아야합니다.