2013-03-15 3 views
2

내가 예를 들어, 서버에서 일부 XML을 수신 한 후 일부 콤보 박스를 채우기 위해 그것을 구문 분석을 시도하는 C++ 프로그램을 가지고있다가 문자TinyXML 멀티 바이트 문자를 구문 분석하지만, 건너 뛰는 다음 [X]

<?xml version="1.0"?> 
    <CustomersMachines> 
     <Customer name="bob" id="1"> 
      <Machine name="office1" id="1" /> 
      <Machine name="officeserver" id="2" /> 
     </Customer> 
    </CustomersMachines> 

이러한 값의 경우 TinyXML은 정밀하게 파싱하고 결과로 생성되는 콤보 상자가 의도 한대로 채워집니다. 이 문제는 멀티 바이트 문자가 name 요소의 끝에 (또는 몇 바이트에 따라) 위치 할 때 발생합니다. 콤보 상자가 발생합니다

<Customer name="boß" id="3"> 

은 내가 볼 디버거를 단계별로부터

= 값 보스 "ID로 채워지는 그 멀티 바이트 문자)는 (READTEXT에 전달되는 경우 1 ~ 3 바이트의 1 바이트 문자를 건너 뛰면 자동으로 포함되므로 tinyXML은 닫는 따옴표를 등록하지 않고 다음에 도달 할 때까지 구문 분석을 계속합니다 .xml을 보내는 서버에서 실행되는 응용 프로그램은 ISO- 8859-1 인코딩 인 반면 tinyXML은 UTF-8을 기본값으로 사용합니다.

나는 TIXML_ENCODING_UNKNOWN을 사용하여 문제를 해결하는 것처럼 보이도록 tinyxml을 조정 해 보았지만 프로그램의 다른 곳에서 상당한 수의 문제가 발생했습니다. 내가 시도한 다른 것들은 그것을 보내기 전에 xml 서버 측 utf8_encode하는 것이지만 (이것은 멀티 바이트 char이 있어야하는 콤보 상자에 이상한 문자가 표시되는 원인이된다.) XML로 보내지는 인코딩을 강제로 클라이언트 프로그램을 사용할 수 없습니다.

이 경우 멀티 바이트 문자가 다음 1-3자를 자동으로 무시하는 것을 방지하는 방법에 대한 의견이 있으십니까?

+0

저장된 파일은 어떤 인코딩입니까? –

+0

실제로는 파일로 저장되지 않습니다. 서버가 그것을 생성하여 클라이언트에게 스트리밍합니다. – user2174599

답변

0

<?xml?> 프롤로그가 인코딩을 지정하지 않습니다. 인코딩이 XML 외부에서 사용할 수없는 경우 XML 사양의 Appendix F에 설명 된 규칙에 따라 XML의 시작 바이트를 분석하여 인코딩을 추측해야합니다. 이 경우 UTF-8이 선택됩니다. XML이 실제로 UTF-8로 인코딩되지 않은 경우, 이는 사용자가보고있는 동작을 설명합니다.

ISO-8859-1

, ß는 바이트 옥텟 0xDF로서 부호화되고, "는 바이트 옥텟 0x22로 인코딩된다.

UTF-8에서 0xDF은 건너 뛴 "을 설명하는 2 바이트 옥텟 시퀀스의 시작 바이트입니다. 그러나 0xDF 0x22은 유효한 UTF-8 2 옥텟 바이트 시퀀스가 ​​아니므로 TinyXml은 오류와 함께 구문 분석에 실패해야합니다. 그렇지 않으면 TinyXml의 버그입니다.

XML이 실제로 ISO-8859-1로 인코딩 된 경우 서버에서 해당 정보를 제공해야합니다. 그렇지 않으면 서버의 버그입니다.

+0

고맙습니다. 인코딩을 제공하면 모든 것을 해결할 수 있습니다. – user2174599

관련 문제