Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

版权申明
查看: 4069|回复: 2

判斷是否 UTF8 編碼 string

[复制链接]

该用户从未签到

发表于 2015-9-10 08:38:41 | 显示全部楼层 |阅读模式
本帖最后由 bruce0829 于 2015-9-10 15:00 编辑

我沒找到 Lazarus 有現成 [判斷是否 UTF8 編碼 string] 的 Function, 所以只好自己弄一個
若有人知道 Lazarus 有現成 [判斷是否 UTF8 編碼 string] 的 Function, 也請不吝告知, 謝謝


// =========================================
// 判斷是否 UTF8 編碼 string
// This function just test whether the string is UTF-8 encoded or not.
// if s isn't UTF-8 encoded then UTF8Decode returns empty string.
// =========================================
function IsUtf8Encoded(const s: String): boolean;
begin
  //Result := (s <> '') and (UTF8Decode(s) <> '') //(網路抄來的, 不準)
  
  //自己測出
  result:=false;
  if (UTF8Length(s)=Length(UTF8Decode(s))) then result:=true;  //uses LazUTF8
end;

回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-9-10 14:57:54 | 显示全部楼层
//利用以上 IsUtf8Encoded(), 讓 TMemo 可以自動判斷是 Ansi Text 還是 Utf8 Text, 而能正確讀入
procedure TForm1.SpeedButton1Click(Sender: TObject);
var TmpList: TStringList;
    IsUtf8Text: boolean;
begin
  TmpList := TStringList.Create;

  if (OpenDialog1.Execute) then
  begin
    //因為lazarus都是UTF-8編碼,如果直接用Memo1.LoadFromFile()
    //在系統會無法開啟Ansi編碼的文字檔, 但是可以透過TStringList來讀入之後,
    //判斷文字內容若是Ansi編碼,就利用AnsiToUtf8()把Ansi編碼轉為UTF-8編碼的文字,
    //就可以放入Memo1.Text來顯示文字檔的內容,也就是TMemo只能顯示UTF-8編碼的文字.
    //儲存檔案時,若原檔案是Ansi編碼,就要先利用UTF8ToAnsi()
    //把Memo1.Text由UTF-8編碼轉為Ansi編碼才儲存,


    TmpList.LoadFromFile(Utf8ToAnsi(OpenDialog1.FileName)); //路徑要用 ansi string ;  


    //判斷是否開啟 UTF8 文件
    IsUtf8Text:=IsUtf8Encoded(TmpList.Text);


    if (IsUtf8Text)  then
    begin
      //開啟 UTF8 文件-----------
      Memo1.Lines.Text:=TmpList.Text;
    end else begin
      //開啟 ANSI 文件-----------
      Memo1.Lines.Text:=AnsiToUtf8(TmpList.Text);
    end;

  end;

  TmpList.Free;
end;   

点评

谢谢分享.可用.对首字符是否是汉字均可用  发表于 2015-9-13 09:39
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-15 09:19
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2015-9-11 09:32:39 | 显示全部楼层
    LConvEncoding.GuessEncoding
    我没测试过··我只知道有这个资料··是不是你想要的·你自己测试一下吧··

    点评

    已测,大概是通过首字符来判断,对混合字符无法正确判断  发表于 2015-9-13 09:40
    回复 支持 反对

    使用道具 举报

    *滑块验证:

    本版积分规则

    QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

    GMT+8, 2025-5-2 10:08 , Processed in 0.037393 second(s), 15 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表