http://www.fileformat.info/info/unicode/char/1f609/index.htm 수동 UTF-16 서로 게이트 쌍을 처리 (또는 타사 라이브러리를 사용) 할 필요가 ANSI 델파이를 사용하는 경우.
이 ANSI 싶게 유니 코드 델파이에서 작동합니다 :
uses
{$IFDEF UNICODE}
Xml.XMLDoc, Xml.XMLIntf, System.AnsiStrings, System.Character;
{$ELSE}
XMLDoc, XMLIntf;
{$ENDIF}
{$R *.dfm}
type
{$IFDEF UNICODE}
ValueString = UnicodeString;
{$ELSE}
ValueString = WideString;
{$ENDIF}
procedure Check(ATrue: Boolean; const AMessage: string);
begin
if not ATrue then
raise Exception.Create(AMessage);
end;
function IsHighSurrogate(AChar: WideChar): Boolean;
begin
{$IFDEF UNICODE}
Result := TCharacter.IsHighSurrogate(AChar);
{$ELSE}
Result := (AChar >= #$D800) and (AChar <= #$DBFF);
{$ENDIF}
end;
function ConvertToUtf32(AHigh, ALow: WideChar): Integer;
begin
{$IFDEF UNICODE}
Result := Ord(TCharacter.ConvertToUtf32(AHigh, ALow));
{$ELSE}
Check(AHigh >= #$D800, 'Invalid high surrogate code point');
Check(AHigh <= #$DBFF, 'Invalid high surrogate code point');
Check(ALow >= #$DC00, 'Invalid low surrogate code point');
Check(ALow <= #$DFFF, 'Invalid low surrogate code point');
// This will return the ordinal value of the Unicode character represented by the two surrogate code points
Result := $010000 + ((Ord(AHigh) - $D800) shl 10) or (Ord(ALow) - $DC00);
{$ENDIF}
end;
function MakeEntity(AValue: Integer): AnsiString;
begin
Result := Format(AnsiString('&#%d;'), [AValue]);
end;
function UnicodeToAsciiWithEntities(const AInput: ValueString): AnsiString;
var
C: WideChar;
I: Integer;
begin
Result := '';
I := 1;
while I <= Length(AInput) do
begin
C := AInput[I];
if C < #$0080 then
Result := Result + AnsiChar(C)
else
if IsHighSurrogate(C) then
begin
Check((I + 1) <= Length(AInput), 'String truncated after high surrogate');
Result := Result + MakeEntity(ConvertToUtf32(C, AInput[I + 1]));
// Skip low surrogate
Inc(I);
end
else
Result := Result + MakeEntity(Ord(C));
Inc(I);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Text := string(UnicodeToAsciiWithEntities(LoadXMLDocument(
'example.xml').DocumentElement.ChildNodes['center'].ChildNodes['b'].NodeValue
));
end;
내가 그렇게 약간이 필요할 수 있습니다 조정, 코드가 XE2에서 작동 정말 2007 년
아니, 여기 델파이 7이없는 명확한. 기본적으로 XML DOM 구현이 기본 다국어 평면 외부의 문자를 디코딩하고 두 개의 UTF-16 단위로 인코딩 한 것에 만족하지 않으십니까? 그리고 다시 SGML 문자 엔티티로 인코딩하려고합니까? –
정말 이해가 안되는데 XML 문서를 추가하는 것을 잊어 버렸습니다 ... 지금 추가하겠습니다 – user3802199
XML 문서가 추가되었습니다 – user3802199