前端之家收集整理的这篇文章主要介绍了
回复 "Globe" 关于 XML 编码转换的问题,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题来源:
http://www.cnblogs.com/del/archive/2011/03/24/1994029.html#2059114
Globe 同学有这样的 XML
文件:
<?xml version="1.0" encoding="gb2312"?> <Root> <friend name="&#x5341;&#x5E74;"></friend> <friend name="&#x66FE;&#x7D93;&#x5954;&#x653E;&#x904E;&#x30FE;&#x20;"></friend> <friend name="&#46028;&#50500;&#50752; &#45208;&#49244; &#45320; "></friend> </Root>
其中包含
中文、韩文,并且有些是十六进制、有些是十进制,真实的
内容应该是:
<?xml version="1.0" encoding="GB2312"?> <Root> <friend name="十年"/> <friend name="曾經奔放過ヾ "/> <friend name="돌아와 나쁜 너 "/> </Root>
下面是把它打开并另存为标准的 UTF-8 格式 XML 的
代码(使用了 DelphiXE 最新的正则表达式组件):
@H_
404_11@unit Unit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,RegularExpressions;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function MyMatchEvaluator(const Match: TMatch): string;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
pattern = '&#x?[0-9A-Fa-f]{1,5};';
var
List: TStringList;
reg: TRegEx;
path,tmpName: string;
begin
with TOpenDialog.Create(nil) do begin
Execute;
path := FileName;
Free;
end;
if path = '' then Exit;
List := TStringList.Create;
List.LoadFromFile(path);
List.Text := StringReplace(List.Text,'GB2312','UTF-8',[rfIgnoreCase]);
reg := TRegEx.Create(pattern,[roCompiled]);
List.Text := reg.Replace(List.Text,MyMatchEvaluator);
tmpName := ExtractFileName(path);
path := StringReplace(path,tmpName,'UTF8_' + tmpName,[rfIgnoreCase]);
Text := path;
List.SaveToFile(path,TEncoding.UTF8);
List.Free;
end;
function TForm1.MyMatchEvaluator(const Match: TMatch): string;
begin
Result := Match.Groups[1].Value;
if Match.Value[3] = 'x' then Result := '$' + Result;
Result := WideChar(StrToInt(Result));
end;
end.
原文链接:https://www.f2er.com/xml/297966.html