【发布时间】:2013-07-18 12:03:17
【问题描述】:
可以在 Delphi 6 中将 XML 转换为 UTF-8 编码吗?
目前这就是我正在做的事情:
- 用 AnsiString 填充 TXMLDocument
- 最后使用
WideStringVariable = AnsiToUtf8(Doc.XML.Text);将数据转换为UTF-8 - 使用
TFileStream将WideStringVariable的值保存到文件中,并在文件开头添加BOM for UTF8。
代码:
Procedure SaveAsUTF8( const Name:String; Data: TStrings );
const
cUTF8 = $BFBBEF;
var
W_TXT: WideString;
fs: TFileStream;
wBOM: Integer;
begin
if TRIM(Data.Text) <> '' then begin
W_TXT:= AnsiToUTF8(Data.Text);
fs:= Tfilestream.create( Name, fmCreate );
try
wBOM := cUTF8;
fs.WriteBUffer( wBOM, sizeof(wBOM)-1);
fs.WriteBuffer( W_TXT[1], Length(W_TXT)*Sizeof( W_TXT[1] ));
finally
fs.free
end;
end;
end;
如果我在 Notepad++ 或其他检测编码的编辑器中打开文件,它会显示带有 BOM 的 UTF-8。但是,它似乎没有正确编码文本。
出了什么问题,我该如何解决?
更新:XML 属性:
XMLDoc.Version := '1.0';
XMLDoc.Encoding := 'UTF-8';
XMLDoc.StandAlone := 'yes';
【问题讨论】:
-
由于我对 unicode 不太了解,因为我的问题才刚刚开始,如果您向我推荐一些有关它的初学者书籍或论文,我将不胜感激。
-
保存了文件但是webservices说它不是UTF-8编码的,还有,编辑器里出现奇怪的字符正常吗?
-
WideString是Microsoft OLE BSTR类型,根据定义是 UTF-16。显示AnsiToUtf8声明,它的返回类型是什么?您应该对变量使用相同的类型,否则会发生文本转换。而且由于您在声明 ANSI 时的输出将包含 UTF-8 文本,这意味着您误导了 Delphi 并促使它使 ANSI->Tf-16 转换为非 ANSI 文本 -
“它会保存文件”,因此请使用 Hex Editor、WinCmd Lister、UniRed、notepad++ 或任何其他类似工具检查它——它是否真的是 utf-8。不管服务告诉你什么——你不应该盲目相信它。 PS D6 是相当有缺陷的版本。你确定你安装了所有的更新吗?也许您现在会考虑升级到 CodeTyphon...
标签: delphi unicode utf-8 delphi-6 txmldocument