2011-12-12 1 views
5

XML 문자열을 즉석에서 만듭니다 (파일에서 읽지 않음). 그런 다음 고치 3을 사용하여 FOP를 통해 PDF로 변환합니다. 중간 Xerces에서 어딘가에 실행됩니다. 하드 코드 된 것을 사용하면 모든 것이 작동합니다. 최대한 빨리 데이터베이스에 독일어 움라우트를 넣고 내가 할 데이터 내 XML을 풍요롭게로 : 다음 밖으로 내 응용 프로그램을 디버깅 및 발견 UTF-8이 있지만 여전히 "1 바이트 UTF-8 시퀀스 중 잘못된 바이트 1"이 표시됩니다.

Caused by: org.apache.cocoon.pipeline.ProcessingException: Can't parse the XML string. 
at org.apache.cocoon.sax.component.XMLGenerator$StringGenerator.execute(XMLGenerator.java:326) 
at org.apache.cocoon.sax.component.XMLGenerator.execute(XMLGenerator.java:104) 
at org.apache.cocoon.pipeline.AbstractPipeline.invokeStarter(AbstractPipeline.java:146) 
at org.apache.cocoon.pipeline.AbstractPipeline.execute(AbstractPipeline.java:76) 
at de.grobmeier.tab.webapp.modules.documents.InvoicePipeline.generateInvoice(InvoicePipeline.java:74) 
... 87 more 

Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence. 
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684) 
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554) 

는, (데이터베이스 다시 한번 확인 온다) 내 "A"가있다 바이트 값 196, 이는 헥스의 C4입니다. 이것이 내가 예상 한 바입니다. http://www.utf8-zeichentabelle.de/

코드가 실패하는 이유를 모르겠습니다.

byte[] bom = new byte[3]; 
bom[0] = (byte) 0xEF; 
bom[1] = (byte) 0xBB; 
bom[2] = (byte) 0xBF; 
String myString = new String(bom) + inputString; 

나는이 정확하게 좋은 아니라는 것을 알고,하지만 난 그것을 시도 - 물론 실패 :

나는 그 같은 수동으로 BOM을 추가하는 것을 시도했다. xml 헤더를 앞쪽에 추가하려고했습니다.

<?xml version="1.0" encoding="UTF-8"?> 

어느 쪽도 실패했습니다. 그럼 나는 그것을 결합. 실패한.

결국 나는 그런 일을 시도 : 이미 UTF-8이기 때문에, 사실 아무것도하지 않고있다

xmlInput = new String(xmlInput.getBytes("UTF8"), "UTF8"); 

. 아직도 실패합니다.

그래서 ... 내가 뭘 잘못하고 있으며 Xerces가 내게 기대하고있는 아이디어가 있습니까?

감사 기독교

+0

동의하지만 도움이되지 않습니다. 데이터베이스에서 오는 문제가되는 문자열은 내 ORM 계층에서 만들어지기 때문에. 또한 0xC4가 정상적으로 처리되어야합니다. – Christian

+0

MySQL을 사용하면 테이블과 열은 utf8_general_ci로 인코딩됩니다. useUnicode = true & characterEncoding = utf8을 jdbc 연결에 추가했습니다. – Christian

+0

다른 인코딩을 사용하여 DB에 연결하는 경우 JDBC 연결에서 이러한 매개 변수를 지정하는 것은 좋지 않을 수 있습니다. 자동 감지가 잘못되었을 때만 사용하십시오. 데이터를 쓰는데 무엇을 사용합니까? BLOB 또는 VARCHAR 열입니까? – JBert

답변

12

데이터베이스에 단일 바이트 (값 0xC4) 만 있으면 UTF-8 인코딩을 사용하지 않는 것입니다.

문자 "LATIN 대문자 LETTER A WITH DIAERESIS"의 코드 포인트 값은 U + 00C4이지만 UTF-8은이를 1 바이트로 인코딩 할 수 없습니다. UTF8-zeichentabelle.de에서 세 번째 열 "UTF-8 (hex.)"을 확인하면 UTF-8이 0xC3 84 (2 바이트)로 인코딩된다는 것을 알 수 있습니다.

자세한 내용은 Joel의 문서 "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)"을 참조하십시오.


EDIT : Christian이 답변을 찾았습니다. Cocoon 3 SAX 구성 요소에서 문제가 있음이 밝혀졌습니다 (저는 이것이 alpha 3 버전이라고 생각합니다). XMLGenerator 클래스에 XML을 String으로 전달하면 SAX 구문 분석 중에 무언가 잘못되어이 혼란을 일으키는 것으로 나타났습니다.당신이 볼 수 있듯이

if (XMLGenerator.this.logger.isDebugEnabled()) { 
    XMLGenerator.this.logger.debug("Using a string to produce SAX events."); 
} 
XMLUtils.toSax(new ByteArrayInputStream(this.xmlString.getBytes()), XMLGenerator.this.getSAXConsumer(); 

가 호출 getBytes() 다음 구문 분석하는 데 실패합니다 JRE의 기본 인코딩으로 바이트 배열을 생성합니다 :

I looked up the code

는 누에 고치 - STAX의 실제 문제를 찾을 수 있습니다. 이것은 XML이 UTF-8로 선언 되었기 때문에 데이터가 바이트로 다시 표시되고 Windows 코드 페이지를 사용하기 때문일 수 있습니다.

는이 문제를 해결 한 다음을 사용할 수 있습니다 (기독교는 API 실험에 의해 발견)

new org.apache.cocoon.sax.component.XMLGenerator(xmlInput.getBytes("UTF-8"), 
     "UTF-8"); 

이 오른쪽 내부 작업을 트리거합니다.

나는 Apache의 버그 추적기에서 opened an issue을 가졌습니다.

편집 2 : 문제가 해결되어 예정된 릴리스에 포함될 예정입니다.

+0

넘어서 나아갈 길! – Pops

2

C4 해당 페이지에 표시가 유니 코드 코드 포인트, U+00C4를 참조하는. UTF-8에서 그러한 Z 드 포인트를 표시하는 데 사용되는 Y이트 순서는 "\xC4"이 아 U니다. 원하는 것은 UTF-8 (16 진수) 열에있는 것인데, 즉 "\xC3\x84"입니다.

따라서 데이터가 UTF-8이 아닙니다.

데이터가 인코딩되는 방식은 UTF-8 here에서 읽을 수 있습니다.

0

저는 XML 데이터 파일을 수동으로 작성하기위한 텍스트 편집기로 Windows 7을 TextPad와 함께 사용하고 있습니다. 나는 MalformedByteSequenceException을 받고있었습니다. xml 파일의 스펙은 UTF-8이었습니다. 주위를 샅샅이 뒤다 보니 제 편집자가 "Tools ... Convert to DOS"라는 도구를 발견했습니다. 나는 그것을했고, 파일을 다시 저장했다. 그리고 예외는 사라졌고 나의 코드는 잘 돌아갔다.

그런 다음 내 편집기에서 해당 파일 형식의 기본 인코딩을 확인했습니다. ASCII였습니다. xml 인코딩 매개 변수를 ASCII로 변경 했더니 또 다른 MalformedByteSequenceException이 있습니다.

Windows 시스템에서는 xml 인코딩을 UTF-8로 유지하려고 시도하지만 인코딩 된 파일은 DOS로 저장하십시오. 나는 이것이 왜 효과가 있는지에 관해서는 더 이상 파지 않았다.

관련 문제