菜鸟问题:提取文本文件里带汉字的字符串,已附上需处理的文件,拜托请帮忙!(200分)

  • 主题发起人 主题发起人 yaanding
  • 开始时间 开始时间
Y

yaanding

Unregistered / Unconfirmed
GUEST, unregistred user!
用Readln逐行读出txt文件中的字符串,再写入另一个新的文本文件中后,汉字(繁体)变成半个汉字显示的乱码,但Asc码是正确的。
原文件的字符串在每个字符之间都有一个#0的控制字符,循环判断可以除去控制字符,但是汉字还是乱码。
想从这样的文本文件中提取可以在delphi里正常显示的带汉字的字符串,不知如何处理。急!先谢谢了!
 
楼主的意思是从包含什么字符都有的文本文件里提取汉字字符吗 ?
 
readln(f,tmp);
if ord(tmp) > 127 then showmessage('可能含汉字');
 
是从什么字符都有的文本文件里提取一段字符串,里面也是可以包含任何字符的。
关键我用Readln读出的String,再直接写入另外的文件或者提取字段存到数据库里之后,汉字显示出来是乱码。
 
/////以前用过的一段截取汉字拼音首字母的代码。请参考下。
unit myunit;

interface
uses
dialogs,sysutils;
function GetPyIndexChar(Hzchar:string):String; /////获取汉字首拼音字母
function RePYStr(HzStr:string):string;/////返回整串汉字首字母串

implementation

function GetPyIndexChar(Hzchar:string):String;
begin
case (Word(hzchar[1]) shl 8 + Word(hzchar[2])) of
$B0A1..$B0C4 : Result :='A';
$B0C5..$B2C0 : Result :='B';
$B2C1..$B4ED : Result :='C';
$B4EE..$B6E9 : Result :='D';
$B6EA..$B7A1 : Result :='E';
$B7A2..$B8C0 : Result :='F';
$B8C1..$B9FD : Result :='G';
$B9FE..$BBF6 : Result :='H';
$BBF7..$BFA5 : Result :='J';
$BFA6..$C0AB : Result :='K';
$C0AC..$C2E7 : Result :='L';
$C2E8..$C4C2 : Result :='M';
$C4C3..$C5B5 : Result :='N';
$C5B6..$C5BD : Result :='O';
$C5BE..$C6D9 : Result :='P';
$C6DA..$C8BA : Result :='Q';
$C8BB..$C8F5 : Result :='R';
$C8F6..$CBF9 : Result :='S';
$CBFA..$CDD9 : Result :='T';
$CDDA..$CEF3 : Result :='W';
$CEF4..$D1B8 : Result :='X';
$D1B9..$D4D0 : Result :='Y';
$D4D1..$D7F9 : Result :='Z';
else
Result := char(0);
end;
end;

function RePYStr(HzStr:string):string;/////返回整串汉字首字母串
var i : Integer;
tem : string;
tt : char;
begin /////客户编码
HzStr := Trim(HzStr);
i := 1;
tem := '';
while i <= length(HzStr) do
begin
tt := HzStr;
if ord(tt) > 127 then
begin
tem := tem + GetPyIndexChar(copy(HzStr,i,2));
//ShowMessage(tem);
i := i + 2;
end
else
begin
tem := tem + copy(HzStr,i,1);
//ShowMessage(tem);
i := i + 1;
end;
end;
Result := UpperCase(tem);
end;
end.
 
谢谢ricoo, 我照你这样做之后,再用Write (NewFile, tmp); 新文件中汉字都变成乱码。
 
用tmp只取到汉字的高八位,低八位得再用 str := tmp + tmp[i+1];来合成一个汉字,这样再试试。
 
tmp+tmp[i+1]是可以的。

你可以使用
s:widestring;
可以强制转换
s:string;
s1:widestring;
s1:=widestring(s);。。
进行处理写入,就可以完全避免。。
 
谢谢楼上的各位朋友。

我仔细看了一下要处理的文本文件,用记事本打开浏览汉字显示正常。

但是如果用UltraEdit打开看Asc码的时候,右边显示出来汉字又是乱码:
 
你的TXT的保存字符集是什么?看下记事本的另存为,下面是显示什么字符集的。不过用UE
没道理显示乱码吧。
 
抱歉使用了widestring问题还是不能解决。

这是我需要处理的文本文件,能不能帮忙看一下,这个文件带很多奇怪控制字符:(

http://www.yousendit.com/transfer.php?action=download&ufid=4544DC121BE041B7
 
自己新建的txt文件的字符集是ANSI, 需要处理的txt文件的字符集是Unicode
 
你的文件是unicode编码格式的,文件头两个字节是标示unicode的
 
用COPY复制一个字符,然后判断ASCII码是否大于165,如果大于则相临的二个字符是汉字
 
你说的那个网址是unicode的,utf-8的xml文件。。。。
使用记事本我的支持UTF-8,不过使用RICHEDIT,就是RLF文件就可以保存这些UTF-8的。。。
UTF-8转换成UNICODE,你可以在我的笔记上找到。。
编程UNICODE的话,WIDESTRING才有效果。。。
 
谢谢大家!
我用String, Char逐个得到原文件的Asc编码的字符串,然后用蓝叶菱的函数转换成Ansi编码的汉字
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
934
DelphiTeacher的专栏
D
D
回复
0
查看
728
DelphiTeacher的专栏
D
D
回复
0
查看
688
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部