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)