2009-11-02 6 views
2

우리 회사에서 우리가 Latin-1에서 UTF-8로 호스팅하는 모든 사이트를 변환하고 싶습니다. 인터넷 검색이 끝나면 Perl 스크립트가 거의 완성됩니다. 지금 누락 된 유일한 것은 XML 파일입니다.Perl에서 XML 문서를 Latin-1에서 UTF-8로 변환하려면 어떻게해야합니까?

XML을 Latin-1에서 UTF-8로 변환하는 가장 좋은 방법은 무엇입니까?

Google에서 대부분의 항목에 정확한 내용을 설명하기 때문에 확신 할 수 없기 때문에 문의하고 있습니다. 심지어 utf8은 XML에 문제를 일으킬 수 있다고합니다. 전체 XML 인코딩 문제에 대해 우리에게 알려줄 수 있습니까?

+1

아, 그런데 : XML 문서의 인코딩을 변환 할 이유가 거의 없어야합니다. XML은 인코딩을 염두에두고 설계되었습니다. doucment에 사용 된 인코딩이 프롤로그에서 주어진 인코딩과 일치하면 모든 올바른 XML 구문 분석기가 모든 사항을 수정합니다. UTF8에서 XML에 문제가 없어야합니다 !!! UTF8은 분명히 사용되지 않아야하는 모호한 인코딩이있을 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다. 우리가 살펴볼 것입니다. 나는 그 때 돌아와서 몇몇 투표를 배포 할 것이다. – Mike

답변

6

무엇을 변환하고 있습니까? 데이터 또는 XML 태그 또는 다른 것?

라틴어 1로 읽어야하고 원본이 정말 이상한 일을하지 않는 한 UTF-8로 다시 작성해야한다고 생각합니다. 디코딩과 인코딩은 파일 핸들 레벨에서 발생합니다. 일단 Perl을 사용하면 내부적으로 UTF-8이 이미 있습니다.

지금까지 무엇을 가지고 계셨습니까? 어떤 문제가 있습니까?

xmllint을 사용하기에는 상황이 너무 복잡합니까?

xmllint --encode utf8 --output filename.xml filename.xml.latin1 

XML :: Parser를 사용하는 경우 해당 모듈에 대해 Juerd's Unicode Advice을 참조하십시오.

그냥 XML 파일보다 더 많은 변환하는 경우, iconv 도움이 될 수 있습니다

iconv -f ISO-8859-1 -t UTF-8 filename.txt.latin1 > filename.txt 
+3

그것은 완전히 정확하지 않습니다! xml 프롤로그와 같은 경우 : 문서가 UTF8로 인코딩 된 경우 수정하거나 삭제해야합니다! –

+0

xmllint는 iconv보다 나은 솔루션이므로 답변을 업데이트했습니다. –

1

브라이언은 Perl로 내부적으로 UTF-8을 언급 한 바와 같이. Perl은 원할지라도 그것을 변환 할 것입니다.

속임수는 각 문자열에 첨부 된 비트 플래그 인 UTF8 플래그에 연결됩니다. XML :: Parser가 반환하는 데이터의 경우 해당 UTF8 플래그가 설정됩니다.

이 동작을 제거하려면 UTF8 플래그를 지우십시오. 다음과 같이 할 수 있습니다.

sub de_utf8 { 
    use bytes; 
    return "$_[0]"; 
} 

이렇게하면 결과 문자열은 원래 문자열과 동일한 바이트 데이터가됩니다.

편집 : OP 주제를 조금 벗어 ... 죄송합니다.

xmllint --encode utf8 --output test.xml test.xml 

올바르게 XML 프롤로그를 포함하여 UTF-8로 (이있을 수 있습니다 어떤 인코딩) test.xml 변환합니다 :

7

나는 xmllint --encode utf8 FILE-NAME, 샘플을 사용하십시오.

관련 문제