1. 程式人生 > >delphi NativeXml的中文支援 亂碼

delphi NativeXml的中文支援 亂碼

一般XML的編碼格式設定成UTF8比較通用,下面演示使用UTF8編碼方式儲存和處理包含中文的XML字串(檔案)。1.設定啟用內建的widestring支援

NativeXml內部使用ANSI string和UTF8編碼的string兩種字串型別。如果要讓NativeXml能夠解析widestring字串的話,直接將TNativeXml的Utf8Encoded屬性設定為True。如下:

FXmlDoc:= TNativeXml.Create;
FXmlDoc.Utf8Encoded:= True;

這樣NativeXml內部會自動對Widestring和utf8做轉換。此處需要注意的是,如果執行FXmlDoc.Clear
以後再次載入Xml字串的話,需要重新設定Utf8Encoded屬性為True,載入檔案或流之前同樣需要設定。


2.載入widestring字串

mmoText 是Tnt Unicode控制元件Text值為Widestring型別,這裡要手動將Widestring轉換成utf8編碼的string,然後呼叫 ReadFromString方法載入。sdUnicodeToUtf8轉換函式NativeXml.pas內建。如下:

FXmlDoc.ReadFromString(sdUnicodeToUtf8(mmoText.Text));


3.使用ValueAsWidestring、FromWidestring

通過使用Node.ValueAsWidestring可以讀取、寫入widestring型別的節點值。節點其他屬性可以使用FromWidestring方法轉換widestring型別到utf8 string。如下:
procedure AddNode(ADoc: TXmlDocument; AName, AValue: widestring);
begin
with ADoc.Root do
with NodeNew(FromWidestring(AName)) do
ValueAsWidestring := AValue;
end;

4.儲存到檔案

將包含中文的XML文件儲存到檔案,最重要一點是設定ExternalEncoding屬性。ExternalEncoding詳細設定參考Help。這裡以utf8為例:

FXmlDoc.VersionString:= '1.0′;
FXmlDoc.EncodingString:= 'UTF-8′;
FXmlDoc.ExternalEncoding:= seUTF8;
FXmlDoc.SaveToFile(’C:\Test.xml’);

如果是非中文作業系統,不能直接使用SaveToFile儲存檔案到含有中文的路徑,解決方法是先建立一個TTntFileStream檔案流然後使用SaveToStream儲存。 

var
lFS: TTntFileStream;
begin
if dlgSave.Execute then
begin FXmlDoc.VersionString:= '1.0';
FXmlDoc.EncodingString:= 'UTF-8';
FXmlDoc.ExternalEncoding:= seUTF8;
lFS:= TTntFileStream.Create(dlgSave.FileName, fmCreate or fmShareDenyNone);
try
FXmlDoc.SaveToStream(lFS);
finally
lFS.Free;
end;
end;
end;

 

5.如果xml是utf-8 格式的  

NativeXml.WriteToString是亂碼,解決方法如下:

Utf8ToAnsi(NativeXml.WriteToString)

一般XML的編碼格式設定成UTF8比較通用,下面演示使用UTF8編碼方式儲存和處理包含中文的XML字串(檔案)。1.設定啟用內建的widestring支援

NativeXml內部使用ANSI string和UTF8編碼的string兩種字串型別。如果要讓NativeXml能夠解析widestring字串的話,直接將TNativeXml的Utf8Encoded屬性設定為True。如下:

FXmlDoc:= TNativeXml.Create;
FXmlDoc.Utf8Encoded:= True;

這樣NativeXml內部會自動對Widestring和utf8做轉換。此處需要注意的是,如果執行FXmlDoc.Clear
以後再次載入Xml字串的話,需要重新設定Utf8Encoded屬性為True,載入檔案或流之前同樣需要設定。


2.載入widestring字串

mmoText 是Tnt Unicode控制元件Text值為Widestring型別,這裡要手動將Widestring轉換成utf8編碼的string,然後呼叫 ReadFromString方法載入。sdUnicodeToUtf8轉換函式NativeXml.pas內建。如下:

FXmlDoc.ReadFromString(sdUnicodeToUtf8(mmoText.Text));


3.使用ValueAsWidestring、FromWidestring

通過使用Node.ValueAsWidestring可以讀取、寫入widestring型別的節點值。節點其他屬性可以使用FromWidestring方法轉換widestring型別到utf8 string。如下:
procedure AddNode(ADoc: TXmlDocument; AName, AValue: widestring);
begin
with ADoc.Root do
with NodeNew(FromWidestring(AName)) do
ValueAsWidestring := AValue;
end;

4.儲存到檔案

將包含中文的XML文件儲存到檔案,最重要一點是設定ExternalEncoding屬性。ExternalEncoding詳細設定參考Help。這裡以utf8為例:

FXmlDoc.VersionString:= '1.0′;
FXmlDoc.EncodingString:= 'UTF-8′;
FXmlDoc.ExternalEncoding:= seUTF8;
FXmlDoc.SaveToFile(’C:\Test.xml’);

如果是非中文作業系統,不能直接使用SaveToFile儲存檔案到含有中文的路徑,解決方法是先建立一個TTntFileStream檔案流然後使用SaveToStream儲存。 

var
lFS: TTntFileStream;
begin
if dlgSave.Execute then
begin FXmlDoc.VersionString:= '1.0';
FXmlDoc.EncodingString:= 'UTF-8';
FXmlDoc.ExternalEncoding:= seUTF8;
lFS:= TTntFileStream.Create(dlgSave.FileName, fmCreate or fmShareDenyNone);
try
FXmlDoc.SaveToStream(lFS);
finally
lFS.Free;
end;
end;
end;

 

5.如果xml是utf-8 格式的  

NativeXml.WriteToString是亂碼,解決方法如下:

Utf8ToAnsi(NativeXml.WriteToString)