2008-11-16 6 views
3

내 응용 프로그램은 urlconnection에서 xml을 읽습니다. xml 인코딩은 ISO-8859-1이며 é 문자가 들어 있습니다. xerces saxparser를 사용하여받은 XML 콘텐츠를 구문 분석합니다. 그러나 lunix OS에서 응용 프로그램을 실행하는 동안 é를 올바르게 파싱 할 수 없습니다. 모든 것이 Windows에서 잘 작동합니다. 혹시 나에게 약간의 힌트를 주시겠습니까? 고마워요.é가 올바르게 구문 분석되지 않습니다.

+0

XML 선언과 함께 XML을 읽는 데 사용하는 코드를 게시하십시오. –

답변

1

나는 이것이 file.encoding과 관련이 있다고 생각합니다. linux에서 -Dfile.encoding = iso-8859-1을 VM 매개 변수로 실행 해보십시오.

이 방법을 사용하면 스트림을 열 때 코드의 어딘가에 올바른 형식을 지정해야 할 수 있습니다.

2

실제로는 다른 인코딩에있을 때 "ISO-8859-1"로 표시된 파일의 경우 일 수 있습니다.

흔히 "ISO-8859-1"및 "Windows-2152"와 함께 발생합니다. 이들은 서로 교환 할 수있는 것처럼 사용되지만 실제로는 사용하지 않습니다. (이 대답 의견에서 모두 인코딩은 "E"에 대한 문자 코드에 동의, 그래서 Windows가-1252은 아마 아님을 명확히하고있다.)

당신은을 찾기 위해 16 진수 편집기를 사용할 수 있습니다 파일에있는 "é"의 정확한 char 코드. 이 값을 파일 인코딩의 힌트로 사용할 수 있습니다. 파일 생성 방법을 제어 할 수있는 경우 책임있는 코드/방법을 사용하는 것이 좋습니다.

+0

자주 혼란스러워하며 실제로는 다르다는 것에 동의합니다. 그러나 e-acute는 U + 00E9의 ISO-8859-1에 있습니다. 따라서이 특별한 경우에는 문제가 아닌 것으로 생각됩니다. –

+0

그러면 파일이 또 다른 * 인코딩으로 저장되었을 수도 있습니다. – Tomalak

1

Tomalak이 제안한 것처럼 xml 파일의 실제 인코딩을 결정해야합니다. 헤더에 명시된 인코딩이 아닙니다.

Internet Explorer에서 시작할 수 있습니다. 인코딩이 올바르지 않으면 다음과 같은 오류가 표시 될 수 있습니다.

텍스트에 유효하지 않은 문자가 있습니다. 오류 처리 자원 ...

또는 다음 하나 지정된 인코딩 현재 인코딩에서

스위치는 지원되지 않습니다. 리소스 처리 중 오류 발생 ...

여러 가지 인코딩 지원이있는 텍스트 편집기를 사용하면 다음 단계를 수행 할 수 있습니다. 무료이며 사용이 간편하고 여러 인코딩을 지원하는 Notepad++을 사용할 수 있습니다. 인코딩에 대한 xml 헤더가 무엇이든간에 편집기는 파일의 인코딩을 감지하고 상태 표시 줄에 표시합니다.

파일 인코딩이 올바른 것으로 판단되면 Java에서 인코딩을 올바르게 처리하지 못할 수 있습니다. Java 문자열은 UTF-16이며 바이트 배열로 /로 변환 할 때 기본적으로 인코딩을 지정하지 않으면 Java는 시스템 인코딩 (Windows의 경우 Windows-1521 또는 최신 Linux의 경우 UTF-8)을 기본값으로 사용합니다. 일부 인코딩 변환은 고정 8 비트 인코딩 (예 : Windows-1252 < -> ISO-8859-1) 간의 변환과 같은 "이상한"문자 만 표시합니다. 다른 변환은 잘못된 문자 때문에 enconding 예외를 발생시킵니다 (예 : Windows-1252 텍스트를 UTF-8로 가져 오기 시도).기본 Windows 플랫폼에서 윈도우 1252으로 인코딩 된 문자열로

// Parse the input 
SAXParser saxParser = factory.newSAXParser(); 
InputStream is = new ByteArrayInputStream(stringToParse.getBytes()); 
saxParser.parse(is, handler); 

변환 stringToParse.getBytes() 반환 :

유효하지 않은 코드의 예는 다음과 같다. 이 단계에서 XML 텍스트가 ISO-8859-1로 인코딩 된 경우 잘못된 문자가 있습니다. 올바른 단계는 String이 아닌 XML을 바이트로 읽고 SAX가 XML 인코딩을 관리하도록해야합니다.

0

XML 선언에서 인코딩을 지정하지 않으면 sax 파서는 기본 인코딩 인 UTF-8을 사용하려고합니다. 당신이 문자 인코딩을 알고 있지만 그것이 XML 선언에 지정되지 않은 경우

, 당신은 InputSource의에 해당 인코딩을 사용하는 파서를 알 수 있습니다 : 내 답변이 늦어

InputSource inputSource = new InputSource(xmlInputStream); 
inputSource.setEncoding("ISO-8859-1"); 
+0

더 정확하게 말하자면, 인코딩이 XML 선언에 지정되어 있지 않으면 * 반드시 * UTF-8을 사용해야합니다. – erickson

+0

감사합니다. 나는 그렇게 생각했으나 확실하지 않았습니다. –

0

죄송합니다. 우리는이 문제를 해결했습니다. Fernando Miguélez가 말한 것과 마찬가지로 입력 스트림에서 잘못된 조작을 수행하여 변환으로 인해 문제가 발생했습니다.

여러분 모두 도와 주셔서 감사합니다.

관련 문제