DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xieqiongxi1
今日帖子: 0
在线用户: 7
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2016/4/14 21:24:13
标题:
求助如何读取文件编码格式 浏览:1375
加入我的收藏
楼主: 16进制文件头是空的,可是用记事本打开另存的时候显示是UTF8,就是读取不出来文件是UTF8的,,
----------------------------------------------
Delphi
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2016/4/14 21:25:13
1楼: 贴图
此帖子包含附件:
PNG 图像
大小:116.0K
----------------------------------------------
Delphi
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2016/4/14 21:26:51
2楼: 测试文件
此帖子包含附件:lwcvod_2016414212651.rar 大小:131.7K
----------------------------------------------
Delphi
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2016/4/14 21:27:19
3楼: 没有按照这个头来,读不出文件是 UTF8的
此帖子包含附件:
PNG 图像
大小:18.6K
----------------------------------------------
Delphi
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2016/4/15 11:04:37
4楼: 只是没有格式头信息而已, 所以文件需要预先告知编码模式, 否则需要自己猜喽

一般这样猜测, 看英文占用字节数, 2个的就是unicode, 一个的就可能是ansi或者utf-8
再看中文, 对于中文部分先用utf-8模板带入看看是否符合, 如果符合就可以认为是UTF-8, 否则认为是ansi, windows的记事本基本就是这么猜的

当然, 猜测也会有错误的情况, 最著名的就是"联通", 用ansi格式保存的"联通"文字, 再用记事本打开会认为是utf-8编码, 从而无法正常显示
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/4/15 11:21:31
5楼: QDAC里的Qstring,有一个函数,DetectTextEncoding,楼主可以研究一下
----------------------------------------------
-
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2016/4/15 23:49:59
6楼: Qstring 确实不错,但是不能识别所有的文本,还有其他的文本无法识别
----------------------------------------------
Delphi
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/4/16 18:20:31
7楼: 本地文件如果没有格式头,全部自动识别是不可能的...只能手工一个个试了...网络上html等内容还好一点,直接可以根据head信息和内容自动判断。
----------------------------------------------
-
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2016/4/16 18:43:36
8楼: unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,TypInfo;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  TTextFormat=(tfAnsi,tfUnicode,tfUnicodeBigEndian,tfUtf8);
const
  TextFormatFlag:array[tfAnsi..tfUtf8] of word=($0000,$FFFE,$FEFF,$EFBB);


var
  Form1: TForm1;

implementation

{$R *.dfm}

function WordLoHiExchange(w:Word):Word;register;
asm
  XCHG AL, AH
end;
 
{ TextFormat返回文本编码类型,sText未经处理的文本 }
procedure 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);
    w:=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;


procedure TForm1.Button1Click(Sender: TObject);
var
   TexF:TTextFormat;
   TexS:string;
begin
   ReadTextFile('1.txt',TexF,TexS);
   ShowMessage(TexS);

   TexS:=GetEnumName(TypeInfo(TTextFormat),Ord(TexF));//枚举值转字符串
   ShowMessage(TexS);

   TexF := TTextFormat(GetEnumValue(TypeInfo(TTextFormat), 'tfUtf8'));//字符串转枚举值
   TexS:=GetEnumName(TypeInfo(TTextFormat),Ord(TexF));//枚举值转字符串
   ShowMessage(TexS);
end;

end.
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行89.84375毫秒 RSS