如何将一个 ansi 的文本文件转为 unicode 格式
procedure
var
TGBUCS.GB_USC2
(var
ascString
:
string);
integer;
: WideString;
ascString;
:
:
:=
char;
ascLen,i
tu
c
begin
tu
SetLength
ascLen
:=
CopyMemory
for
:=
begin
c
ascString[i
ascString[i
:=
i
*
2);
(ascString,Length
(tu)
(ascString);
Length
(@ascString[1],@tu[1],ascLen);
1
ascLen
div
to
2
do
ascString[i
2
2]
*
*
-
:=
1];
ascString[i
*
2];
*
-
:=
2
1]
c;
end;
end;
Top
AnsiToUTF8
UTF8ToUnicode
看一下这两个函数的帮助。
还有这个,可能这个更符合你的要求:
StringToWideChar
你可以用一个 TStringList 将文本文件 Load 进来,然后声明一个 WideString 变量,最后调
用上面的 StringToWideChar,转换后的信息保存在 WideString 中。
再声明一个 MemoryStream 将 WideString 写进流中。
最后将流保存为一个文本文件。
你去文件文件看,它就是 Unicode 编码的,且信息一样。
这就是在程序中的方法,信不信由你!
以前我也为 ansi 和 unicode 的转换,看遍了这些函数,其实最简单的方法
就是
Ansi->Unicode
strUnicode
:= WideString(strAnsi);
Unicode->Ansi
strAnsi
:=
AnsiString(strUnicode);
谢谢你的回复,我按你的方法做,
发现如果 a.txt 中都是英文字符的话就都没问题。
如果中间有中文字符,结果就不对了。
我之前是用 filestream 来读写,结果也跟这一样。
procedure
var
TForm1.Button1Click(Sender:
TObject);
a:tstringlist;
b:TMemoryStream;
stransi:string;
strunicode:widestring;
begin
;
;
a:=tstringlist.Create
a.LoadFromFile('c:\a.txt');
stransi:=a.Text
a.Free;
strunicode:=widestring(stransi);
b:=TMemoryStream.Create
;
b.Write(strunicode[1],length(strunicode)*2);
b.SaveToFile('c:\b.txt');
b.Free;
end;
Top
好吧,让我来解析为什么吧,那是因为每一种格式的文本在最开头都会有一个标识,标
识它是什么编码。比如 Unicode 的最开头就是 FFFE。笔记本就是根据最开头的这个标识来
识别它是什么码的。
而你在上面写的时候,没有将这个标识写在文件的最开头,所以你用笔记本打开的时候识
别不了,不信你打开之后选另存为,就可以看到它识别为 Ansi 码了,所以会显示不对。
正确的做法是在文件的开头写进 FFFE 这个标识,就可以正确显示了。
下面是源码:
var
SL:
TStringList;
TMemoryStream;
String;
MM:
AnStr:
WS: WideString;
P:
PByteArray;
begin
SL:=
MM:=
try
TStringList.Create;
TMemoryStream.Create;
SL.LoadFromFile('test.txt');
AnStr:=
WS:=
SL.Text;
AnStr;
//转为 Unicode
*
2
//文本开头写进 Unicode 的标识
GetMem(P,
$FF;
P[0]:=
$FE;
P[1]:=
MM.Write(P^,
Sizeof(Char));
2
*
Sizeof(Char));
//将 Unicode 文本写进流中保存。
MM.Write(PWideChar(WS)^,
MM.SaveToFile('test2.txt');
Length(WS)
*
Sizeof(WideChar));
FreeMem(P);
finally
SL.Free;
MM.Free;
end;
end;
我先在一个笔记本中写下:“yes 是的,这是 Unicode”,然后保存为 Test 文件。这个时候
它是 Ansi 编码。
执行我上面的代码之后,文本保存为 Test2,这时它就是 Unicode 码了,可以正确显示,
你可选另存为看看它是不是 Unicode 编码。