怎样从文件中区分ascii 和unicode(100分)

  • 主题发起人 主题发起人 it80
  • 开始时间 开始时间
I

it80

Unregistered / Unconfirmed
GUEST, unregistred user!
用 srcfile:=tfilestream.create 后
i:=sizeof(srcfile)
for v:=1 to i do
srcfile.read(buff,size(char)) 在这里用char读出的是byte,若用widechar读出的都是2byte
那我怎样知道下一个字是byte or dubble byte?
 
unicode 的文本文件带有个头(2字节) $FF $FE。
 
我的意思是如在HTM或其他文件中,怎样读出字符的问题,并不是文件是否是unicode的问题,就是说怎样
读出字符的16位码,如空格为$20,而中文某字符(假设)为$D4 $23,即他是双字节的,
如果用srcfile.read(buff,size(char))可以分辨出$20,而不知道双字节字符的标志,
i:=sizeof(srcfile)里的i是对应byte数的,这样当对文件进行转换时,从新写文件,
时,用文件流desfile.write(stringfile^,nil) (不论stringfile是widestring还是string型的
)中文或其他双字节字符就会有问题,
我看到很多太多软件都是有这样的问题,就看那位大虾能够拔出一把又快又好大大刀来了!

 
把读出来的付到widestring
ws widestring ;
s:string;
c:string;
ws:=s;//你读出来的
for i:=1 to length(ws) do
begin
c:=ws;
if length(c)>1 tnen 双字节 else 单字节
end;
 
to it168
我明白你的意思了,其实 unicode (WidString) 里的字符全是双字符的,
你说的哪种情况是指如何区分 ANSI 字符串里混合的双字节中文和其他字符,这种字符串称为 MultiByte,
Windows API 中提供一些函数,可以完成 MultiByte 到 Unicode 转换,名字可以猜到就是:
MultiByteToWideChar 。
其实俺以前对这个问题是这样解决的,汉字(GB码)的字符是由两个字节形成,分别称区码(高)和位码(低)
普通字符 Ascii 码是小于 128 的(用 ASC 函数可返回字符 ascii),而汉字两个码
都是 160 ~ 254 的,根据这点我们可以先判断出,如果连续出现2个(160~254)的字符就
可以认为是一个汉字。
这里给出一个数出字符串中汉字个数的函数,以前写的,供你参考:

function HZCount(const s: string): integer;
var
i : integer;
begin
i := 0;
result := 0;
while i < Length(s) do
begin
if (s[i + 1] in [#161..#255]) and (s[i + 2] in [#161..#255]) then
begin
inc(result);
inc(i, 2);
end
else
inc(i);
end;
end;
 
Asc字符的字节最高位为0
 
谢谢各位,我已自己解决问题,基本上与ugvanxk 的做法差不多
但 轻松虎 的做法在用stream中更有用一些
顺便问一下 汉字两个码都是 160 ~254 的,那么其他语言应该有自己的分布范围,是怎样的?
那么非语言的分布范围是哪里?单比特128—159 完全是控制符吗?
谢谢
 
后退
顶部