在delphi中读取非ansi格式文本文件的问题

lumj 2006-11-07 09:39:50
用delphi用下面代码
AssignFile(f1,APath);
Reset(F1);
while not Eof(F1) do
begin
Readln(F1,Ch);
Result.Add(Ch);
end;
CloseFile(F1);}
读取非ansi格式时,会出现乱码,应该如何解决呢?
我在csdn搜到一篇,用unicode改成ansi读取,可是这种方法显然不行,因为我不知道用户会打开什么格式的文件,总不能要用户自己选吧?我不相信delphi 这个号称"聪明的程序员用的"东东会连这一方面都考虑不到,我想这只是我的水平低的缘故,所以期望csdn的高手指点
...全文
523 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lumj 2006-11-14
  • 打赏
  • 举报
回复
你的代码略有一点小问题,不过整体对我帮助很大,万分感谢
lumj 2006-11-08
  • 打赏
  • 举报
回复
万分感谢happyggy(Delphi<-&&->java,可是我发现代码在我的电脑上运行有几个问题,我是winxp sp2+d2006
1.当文本是Unicode时,会识别成 Unicode big endian,反之也是
2:会把UTF-8识别成ANSI的

这是怎么回事呢?高手请指点
happyggy 2006-11-08
  • 打赏
  • 举报
回复
Utf8ToAnsi()
UnicodeToUtf8()
还有这几个函数
happyggy 2006-11-08
  • 打赏
  • 举报
回复
看错了,
首先,不同编码的文本,是根据文本的前两个字节来定义其编码格式的。定义如下:

ANSI:        无格式定义;
Unicode:       前两个字节为FFFE;
Unicode big endian: 前两字节为FEFF; 
UTF-8:        前两字节为EFBB; 

知道了各种编码格式的区别,写代码就容易了,以下是我在一个软件中写的处理代码:
(注意,Delphi的TMemo/TRichEdit只支持ANSI的文本文件,其它编码格式的文件需要自行写代码转换成GB2312或BIG5,方能正确显示)

type
TTextFormat=(tfAnsi,tfUnicode,tfUnicodeBigEndian,tfUtf8);
const
TextFormatFlag:array[tfAnsi..tfUtf8] of word=($0000,$FFFE,$FEFF,$EFBB); 

procedure WordLoHiExchange(var w:Word);
var
b:Byte;
begin
b:=WordRec(w).Lo;
WordRec(w).Lo:=WordRec(w).Hi;
WordRec(w).Hi:=b;
end;

{ TextFormat返回文本编码类型,sText未经处理的文本 }
function ReadTextFile(const FileName: string;
var TextFormat: TTextFormat; var sText:string);
var
w:Word;
b:Byte;
begin
with TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone) do
try
Read(w,2);
WordLoHiExchange(w);//因为是以Word数据类型读取,故高低字节互换
if w = TextFormatFlag[tfUnicode] then
TextFormat:= tfUnicode
else if w = TextFormatFlag[tfUnicodeBigEndian] then
TextFormat:= tfUnicodeBigEndian
else if w = TextFormatFlag[tfUtf8] then
begin
Read(b,1);//这里要注意一下,UFT-8必须要跳过三个字节。
TextFormat:=tfUtf8;
end else
begin
TextFormat:=tfANSI;
Position:=0;
end;
SetLength(sText,Size-Position);
ReadBuffer(sText[1],Size-Position);
finally
Free;
end;
end;
//====================================
判断出是什么编码后在进行转换就ok吧
happyggy 2006-11-08
  • 打赏
  • 举报
回复
AnsiToUtf8()
试一下这个函数
Windows的通用应用程序的类名 使用API函数复制移动文件 使用API访问ListBox项 使用GetTempFileName创建一个唯一的临时文件 使用INI文件 使用INI文件保存、装载字体信息 使用TFileStream 使用TStream保存字符串 使用TTreeview显示目录 使窗体的关闭按钮失效 修改文本文件 允许在资源管理器拖放文件 减小EXE文件大小 列举驱动器 列出目录下的子目录 创建快捷方式 创建目录 删除文件到回收站 判断文件夹是否共享 剪贴板存放多个控件流 加载CDROM图标 压缩和解压流 取MP3的ID3-Tag 取Program files目录 取可执行文件类型 取和文件类型关联的应用程序 取当前程序所在目录 取指定文件的版本信息 取文件修改日期 取文件日期 取文件最后访问日期 取文件版本号 取文件的所有者 取目录大小 取磁盘可用空间和总空间 取设置当前目录 取设置文件夹的日期 向Exe文件添加数据 向文件写添加文本 在TMemo光标位置插入一个文件 在Windows开始后自动运行一个程序 在应用程序添加Exe文件并且执行 在文件搜索字符串 在文件搜索指定文本 在文本文件搜索文本 将剪贴板复制到流和恢复 将文本文件赋值给一个字符串 将资源文件Rft文本装载到TRichEdit 将长文件名转换成短文件名 彻底删除文件 打开资源管理器且显示指定文件夹 捕获DOS应用程序的输出 改变TPageControls的颜色 改名、移动、删除文件或目录 显示‘打开方式’对话框 显示文件属性对话框 显示目录选择对话框 显示目录选择对话框并指定初始目录 替换正运行的DLL 检查文件是否ASCII格式 检查文件是否在本地驱动器 检查文件是否已打开 检查文件是否正在使用 检查目录是否存在 比较两个文件是否相同 添加去掉路径名后的符号 添加文件到文档菜单 清空文档 获取文件类型 获得快捷方式信息 获得文件大小 计算文件的校验和 设置文件日期 读 table-textfile 到 StringGrid 读取二进制文件使用ASCII显示 转换OEM到ANSI 转换短文件名为长文件名 运行一个程序或打开一个关联文件 返回UNC路径 通过CRC-32验证文件

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧