2012-01-06 2 views
1

우리는 Delphi Environement를 Delphi2007에서 Delphi XE2로 마이그레이션하려고합니다. 우리는 Sourceforge에서 최신 Turbopower xml 파트너를 개발했습니다. 그물. 우리는 간단한 테스트 우리가 오류가 XML 파일을로드 할 때 "잘못된 XML 문자가 발견"코드의 우리의 선Turbopower XML 파트너를 Delphi XE 2와 함께 사용

var 
    testxml : UnicodeString; // a normal String in Xe2 
    FModel: TXpObjModel; 
begin 
    FModel := TXpObjModel.Create(nil); //Step 1 
    FModel.LoadMemory(testxml[1], Length(testxml)); //Step2 
end. 

변수 "Textxml"타입이 ​​AnsiString을 변경하는 경우 코드는 2 단계에서 실패 그러면 xml이 제대로로드됩니다.

XML 인코딩이

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

그래서 하나가 우리를 제안 할 수 있습니다와 같은 UTF-8

뭔가 방법 유니 코드 문자열 변수 유형에 저장된 XML 데이터를로드하는 것입니다?

+2

Turbo Power XML 파트너를 삭제하고 타입이 지정되지 않은 매개 변수를 호출하고 직접 바이트 버퍼 관리를 할 필요가없는 OmniXML로 이동하는 것이 좋습니다. 얼마나 못생긴 API인가. –

+0

@WarrenP가 여기에 있습니다. 터보 파워 (Turbo Power)는 죽었고 실제로 유지 관리되는 XML 라이브러리로 옮겨 가야합니다. –

+0

Delphi 2009와 XE, XE2에서 XML 파트너 COMPILES는 괜찮 았지만 완전히 유니 코드를 인식하지 못하고 유니 코드를 지원하지 못했을 수도 있습니다. 그러한 것들은, 특히 옛날에는 더 이상 활발히 사용되지 않는 기술에 의해 가정되어서는 안됩니다. –

답변

2

당신은 같은 UTF8로 다시 유니 코드 문자열을 변환 할 수 있습니다 : 당신은 ByteLength가를 사용해야합니다, 또한

var 
    textxml: UnicodeString; 
    textutf: UTF8String; 
    FModel: TXpObjModel; 
begin 
    textutf := Utf8Encode(textxml); 
    FModel := TXpObjModel.Create(nil); //Step 1 
    FModel.LoadMemory(textutf[1], ByteLength(textutf)); //Step2 
end; 

() 기능, 메모리에 문자열의 실제 크기는 길이 * 인 SizeOf 때문에 (CharType).

+1

그냥'textutf : = textxml'라고 쓰면 컴파일러가 작업을 할 수 있습니다 –

+0

명시 적으로 암시 적보다 낫다 – arthurprs

+0

흠, 리플렉션에서 아마도 당신과 동의 할 것 같아요 –