最后解答:
首先要说明的是GB-13000是中国的编码标准,与UNICODE兼容,我就把它理解为就是中国的UNICODE(也许不对,呵呵)。而UCS-2也就是双字节编码。用两个字节16位表示一个字符。那么对于这种编码我觉得只需要注意的是:这种编码的高8位在后面,而低8位在前面。这对转换相当重要。你可以理解为外国人(比如美国),名在前面而姓在后面。我打这个比喻就是让你想象中国人的姓名称呼习惯。呵呵,姓前而名在后。这也是GBK的编码方式了。见下面了。
而GBK就是中国自己的标准了。它是GB2312的一个扩展,并和GB2312兼容。也就是GB2312的升级版本。就好象INTEL的处理器,P3到P4,升级了,但还是奔腾,只是容量更大了而已。GBK也是比GB2312含有更多的字符。现在WINDOW支持的是GBK。而比如IE内的编码写的是GB2312,我的理解是可能只支持常用的字符。要么其实系统用GBK来解释,我没有验证!
罗嗦的很,SORRY。转入正题。
现在要转换GB13000为GBK。其实简单点说,都是双字节编码格式,唯一的区别就是高第字节的位置不一样而已。那么我们要做的工作就是把这两个东东换个地方就可以了。下面开始手术,嘿嘿(其实我讨厌上医院,好贵!)
1:获取包含GB13000编码的文本文件。
2:把文件读入缓存。
3:把缓存中的数据转换为序数(这步对理解很关键,本来是编码,编程了序数,那不就是成了一堆纯粹的二进制的0和1了吗?先恢复本来面目,再重新编码,就是这么回事了)
4:每两个字节为单位读取。一个个字节的读。
5:将后读的字节(高位)*256加先读出的字节(低位),不就重新组合了吗?
6:用WideChar()可以重新编码成GBK了。完毕
具体的代码如下:大家自己去研究一下:
iFileHandle := FileOpen(ExtractFilePath(Application.ExeName) + 'wz.txt', fmOpenRead); // 打开文件并获取句柄
iFileLength := FileSeek(iFileHandle,0,2); //通过定位到文件尾部来获得文件的长度
FileSeek(iFileHandle,0,0); //重新定位到文件开头部分准备读取
Buffer := PChar(AllocMem(iFileLength + 1)); //分配内存空间准备存放要从WZ.TXT中的信息
iBytesRead := FileRead(iFileHandle, Buffer^, iFileLength); //将信息读入分配的缓存中并返回真实的字节数
FileClose(iFileHandle); //关闭打开的文件
i:=0;
Memo1.lines.clear;
while (i <= iBytesRead - 1) do
begin
ordChar := Ord(Buffer[i + 1]) * 256 + Ord(Buffer); // 通过从内存获取内码,转换为序数并合并高低字节.*256就是将低8位变成高8位
readString := readString + widechar(ordChar); //使用wideChar函数就可以显示宽字符了.即显示出汉字.
如果大家还有不懂的,愿意一起交流,共同提高。我的QQ是:602027784