Delphi 处理 Windows 下的文本文件的 Unicode 的问题

delphi中取得文件编码,字符串编码的方法 注意,这里的取字符编码仅仅对有标识的字符起作用,而有些没有标识的字符串要得知是什么编码可能要进行逐字符对比了  unit EncodeUnit;interfaceuses  SysUtils, Windows, Classes;type  TTextFormat = ( tfAnsi, tfUnicode, tfUnicodeBigEndian, tfUtf8 );cons 阅读详情

用 Delphi 写了个程序,在 Windows 底下,加载一个文本文件,查里面的字符串。

文本文件,随手用 Windows 的记事本编辑了一个。

程序运行起来,测试这个文本文件,正常。

但是,某天我把 Windows 的系统语言设置为英语,再次跑这个程序,加载上述文本文件时,出错了,查不到应该有的字符串了。

用记事本打开那个文本文件一看,里面的中文字符串是乱码。这才想起来,Windows 的记事本,默认保存的格式是 ANSI。在中文的 Windows 环境下保存的中文字符串,在英文环境下打开,就是乱码。

于是俺对这个文本文件进行了测试,保存为 Unicode,保存为 UTF8,然后在中文和英文的 Windows 底下进行测试。

以下是测试结果:

procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;
  S: string;
begin
{--------------------------------------------------------------------------
  以下代码用 TStringList 直接加载一个文本文件,直接读取它的 Text 属性,
  获得的 Text 是 UNICODE 编码的字符串。
  因此应该是 Delphi 的 TStringList 在输出字符串的时候自动做了一个解码操作。
  但这个解码操作不能处理无 BOM 的 UTF8 编码的文本文件。

  以下代码能够处理 UTF8 BOM 编码的文本文件;
  不能处理 UTF8 无 BOM 编码的文本文件。

--------------------------------------------------------------------------}

  S := '深圳';
  if OpenDialog1.Execute then
  begin
    SL := TStringList.Create;
    try
      SL.LoadFromFile(OpenDialog1.FileName);
      Memo1.Lines.Add('-------------------');
      Memo1.Lines.Add(SL.Text);

      if SL.IndexOf(S) > 0 then
      begin
        ShowMessage('Found target');
      end
      else
      begin
        ShowMessage('Can not found 深圳');
      end;

    finally
      SL.Free;
    end;
  end;
end;

以下是另外一段程序:

procedure TForm1.Button2Click(Sender: TObject);
var
  M: TMemoryStream;
  S: string;
  B: TBytes;
begin
{--------------------------------------------------------------------------
  以下代码能够处理 UTF8 BOM 和 UTF8 无 BOM 的两种不同编码,都能正确解码为 UNICODE 给 MEMO 显示。
--------------------------------------------------------------------------}
  if OpenDialog1.Execute then
  begin
    M := TMemoryStream.Create;
    try
      M.LoadFromFile(OpenDialog1.FileName);

      M.Position := 0;
      SetLength(B, M.Size);
      M.Read(B[0], M.Size);

      S := TEncoding.UTF8.GetString(B);

      Memo1.Lines.Add(S);
    finally
      M.Free;
    end;
  end;
end;

上述程序,都在中文的 Windows 和英文的 Windows 底下做了测试。

因此,现在编程的时候需要注意,如果使用到外部的文本文件,最好是保存为 UNICODE 格式。

在 Delphi 的源代码里面写死的中文字符串,则因为是 Unicode 格式,放到哪个系统下,都还是那个字符串,不会因为系统变了导致出问题。

-----------------------------------------------------

更进一步:

如果是数据库而不是文本文件,作为外部数据源。这种情况下,不同的数据库可能有不同的情况。以目前 Delphi FireDAC 支持的 SQLite 数据库来说,最好设置数据库文件的编码格式是 UTF8,这样方便程序在任何语言的系统下正常工作。然后注意:

1. 如果是 NVarChar 类型的字段,FireDAC 的 TField.AsString 会自动将里面存储的 UTF8 格式转换为 UNICODE 格式;

2. Blob 字段,如果直接读取它的 TField.AsString 则不会自动转换,因此如果把 TDBMemo 绑定到一个 Blob 字段,会显示乱码(里面显示的是 UTF8 而不是 UNICODE,说明 TDBMemo 不会自动处理 UTF8);

3. 如果是 Memo 字段,对应的 FireDAC 的字段类型也是 Memo 类型,则直接绑定到 TDBMemo 上面,是可以正确显示文本内容的。说明 FireDAC 的 TField.AsString 对 Memo 字段的 UTF8 编码做了自动的解码处理。

Delphi 7 TNT Unicode控件安装与Indy FTP编码问题解决方案 Unicode是计算机科学中用于统一字符编码的国际标准,其核心原理是为全球所有字符分配唯一编码点,解决多语言环境下的乱码问题。在桌面应用开发领域,Unicode支持对于软件国际化至关重要,直接影响用户体验和市场适应性。Delphi 7作为经典的Windows开发工具,其原生VCL基于ANSI编码,在处理中文、日文等非拉丁字符时存在局限。TNT Unicode Controls作为第三方解决方案,通过重写控件底层实现,为Delphi 7项目提供了完整的Unicode支持能力。在实际工程实践中,特别是涉及网络传 阅读详情

相关推荐

Delphi7 TNT Unicode控件:解决多语言乱码的实战指南

在软件开发中,字符编码是处理多语言文本的基础技术,Unicode作为国际标准,旨在统一全球字符表示。其原理是为每个字符分配唯一码点,解决传统编码(如ANSI)在多语言环境下的兼容性问题。在Delphi7等早期开发环境中,VCL控件默认使用AnsiString,导致中文等双字节字符易出现乱码,这凸显了Unicode支持的技术价值。TNT Unicode Controls通过提供WideString属性的替代控件(如TTntEdit),直接对接Windows Unicode API,有效解决了界面层的乱码问题。

weixin_33853827的博客 438

Delphi与字符编码(实战篇)

Delphi与字符编码(实战篇) Posted on 2008-01-05 22:39 保权 阅读(136) 评论(0)  编辑  收藏 所属分类: 字符编码 、Delphi <!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elemen

jiljil的专栏 3590

Delphi 7 Unicode终极方案:TNT 2.3控件包安装、迁移与网络组件乱码实战

Unicode是计算机科学中用于统一处理全球字符集的核心编码标准,其原理在于为每个字符分配唯一码点,解决了多语言环境下的文本兼容性问题。这项技术的核心价值在于实现软件的国际化与本地化,是构建跨区域应用的基础。在桌面开发领域,特别是使用Delphi等传统技术栈时,Unicode支持直接影响程序的健壮性与用户体验。本文聚焦于Delphi 7这一经典开发环境,深入剖析其原生VCL控件对Unicode支持的缺失这一技术痛点。通过引入TNT Unicode Controls组件包,开发者可以系统性地解决从用户界面到文

weixin_30600197的博客 345

Delphi读写UTF-8、Unicode格式文本文件

====================================================== 注:重要!用眼过度需要养眼,点此养眼! ====================================================== china-pub 计算机绝版图书按需印刷服务 =======================================

391

Delphi 7 Unicode兼容方案:TntUnicodeControls实战指南

Unicode是现代Windows系统的核心字符编码标准,其原理在于通过UTF-16统一映射全球字符,解决ANSI时代多代码页冲突问题。在Delphi开发中,Unicode支持直接决定中文界面渲染、输入法集成与文件路径处理的可靠性。TntUnicodeControls作为专为Delphi 7等旧版设计的轻量级控件补丁,无需升级IDE或依赖外部运行时,即可实现ANSI到Unicode的无感过渡。它通过字符串层、消息层和字体层三重钩子,保障Edit、ComboBox、Dialog等关键控件正确处理中文输入、显示

weixin_29218963的博客 357

Delphi 2010:面向Windows的高效开发环境

Delphi 2010是Embarcadero公司推出的一款面向Windows平台的应用程序开发工具,它继承了Delphi语言简洁易用的特点,并提供了丰富的VCL库和工具组件,使得开发者能够快速构建功能强大的应用程序。本章将探讨Delphi 2010的基本应用开发流程、关键技术和新特性。本地化是一个将应用程序从一种语言或地区设置转换为另一种语言或地区设置的过程。它涉及到软件界面的翻译、文化适应性调整以及对特定地区格式的支持,比如日期、时间、货币和数字格式。

weixin_42511832的博客 918

Delphi 7到10.4.1 Unicode迁移实战:字符串、VCL与API重构指南

Delphi字符串类型从AnsiString到UnicodeString的演进,本质是Windows平台字符编码范式的升级——从ANSI/GBK单字节编码转向UTF-16全栈Unicode支持。其核心原理在于RTL运行时库对内存布局、比较逻辑、API交互及组件生命周期的底层重定义。这一转变带来显著技术价值:统一国际化支持、消除代码页依赖、提升多语言兼容性。典型应用场景包括银行柜台系统、ERP、医疗HIS等长期维护的Windows桌面遗产系统升级。实际落地中,必须直面字符串隐式转换陷阱、VCL组件ARC内存管

weixin_33924770的博客 330

深入理解Windows API与Delphi编程

本文详细探讨了Windows编程中的关键概念,如对象句柄、常量、字符串处理以及如何导入和使用Windows API函数。特别指出,正确理解和使用Windows API函数是Delphi开发者必备的技能,尤其是在处理特定功能或优化应用程序大小时。文章还涉及了Windows的Unicode支持、回调函数的概念、以及窗口移动和排序的高级技术。

weixin_34581040的博客 718

Delphi in a Unicode World Part I

--- Delphi in a Unicode World Part I: What is Unicode, Why do you need it, and How do you work with it in Delphi? By: Nick Hodges 原文链接:http://dn.codegear.com/article/38437 Abstract:...

axit27651846的博客 203

Delphi图片浏览器开发:从源码移植到现代IDE的完整指南

在桌面应用开发中,图像浏览与处理是常见需求,其核心在于高效解码、渲染与界面交互。传统Delphi项目常依赖第三方控件实现类似ACDSee的功能,但随着IDE版本迭代,控件兼容性问题频发,导致开发受阻。通过源码级移植,开发者可深入理解图像处理原理,掌握内存管理、异步加载等关键技术,提升工程实践能力。本文聚焦Delphi 7到现代版本的迁移,涵盖Unicode适配、第三方库替换、性能优化等核心环节,并结合Skia图形库升级方案,为构建高性能图片浏览器提供完整路径。

weixin_34342992的博客 385

TNT 2.3.0 发布:老 Delphi 项目如何跨越 Unicode 断层

字符编码是软件国际化的地基,而旧版 Delphi 的 VCL 默认基于 AnsiString,界面文本在中文、日文等代码页之间转换时常出现乱码。兼容层组件通过 Tnt 控件族将用户界面切换到 WideString,并调用 Unicode API,让老项目无需重写就能正确显示生僻字与 emoji。这样的改造不仅能止住遗留系统的显示层失血,也为后续升级新版 IDE 提前排雷。对于维护老 Delphi 系统的团队而言,TNT Unicode Controls 2.3.0 提供了一次低成本、可验证的 Unicode

weixin_32050773的博客 167

Delphi in a Unicode World Part II

Delphi in a Unicode World Part II: New RTL Features and Classes to Support Unicode By: Nick Hodges 原文链接:http://dn.codegear.com/article/38498 Abstract: This article will cover the n...

axit27651846的博客 231

Delphi老版本Unicode兼容方案:TntUnicodeControls实战指南

Unicode是现代Windows应用的基础文本编码标准,其核心在于宽字符(WideChar)支持与UTF-16/UTF-8正确转换。在Delphi 7/2007等早期版本中,因默认使用AnsiString且GDI绘图链路未适配Unicode,导致中文乱码、字体加载失败、INI文件解析异常等典型问题。TntUnicodeControls通过底层钩子重写文本渲染、字体绑定和资源加载逻辑,无需升级IDE或重构代码,即可实现零侵入式Unicode兼容。该方案广泛应用于银行终端、工业HMI等无法升级的存量系统,特别

weixin_28739079的博客 175

关于delphi的程序在英文操作系统下乱码问题

由于delphi7编译的程序是非unicode程序(代码页),所有在英文操作系统下会有乱码的问题。 解决方法: 1. 首先在Lageuage中选"Instal files for East Asian Lanuages",这步一定要做,否则中文就乱码。 2. 区域设置里面的Advanced选默认的非Unicode的程序的的语言解释为Chinese(PRC),Delphi是非Unicode程序,而vb6和.net都是Unicode的程序,所以这步对vb6和.net程序应该是不需要 3. 但有些客户不允

一万个兵的专栏 1886

DELPHI自带的VCL都不支持UNICODE字符

DELPHI自带的VCL都不支持UNICODE字符,上网找了下,发现有个TNT系列的三方控件包支持UNICODE(菜单控件对UNICODE持不好),但没有我很常用的一个控件 TLabeledEdit,自己加上来了.. 装前需安装TntUnicodeControls控件包,且要将包"TntUnicodeVcl_R70.dpk"的 Build Control 设置为非 Rebuild as needed. 本人用D7.

Delphi读写UTF-8、Unicode格式文本文件 .mht

Delphi读写UTF-8、Unicode格式文本文件 .mht

Delphi 7到10.4.1 Unicode迁移实战:字符串重构与系统兼容性避坑指南

Unicode是现代Windows应用的基础字符编码标准,其核心在于统一多语言文本的存储与处理机制。Delphi自2009年起全面转向UnicodeString,默认字符串类型由AnsiString升级为宽字符,引发内存布局、API调用、数据库映射及第三方组件ABI等深层兼容性问题。这一转变不仅影响编译通过性,更决定运行时数据完整性、界面渲染准确性和跨平台交互可靠性。典型应用场景包括银行核心系统升级、遗留ERP维护、外包项目交付等需高稳定性的工程实践。本文聚焦Delphi 7至10.4.1迁移中Unicod

weixin_34187862的博客 335

影刀RPA:轻松搞定Excel表格自动化操作

影刀RPA是一款功能强大的自动化工具,通过模拟人类操作实现各种重复性任务的自动化。零代码操作:通过拖拽式流程设计器,无需编程基础即可快速上手。功能丰富:提供丰富的组件库,涵盖文件操作、数据处理等多种功能。高效稳定:支持多任务并行,确保任务的高效执行和稳定性。支持Python语法:内置数据表格,支持Python语法,对新手友好,同时具备循环功能。通过影刀RPA,您可以轻松实现Excel表格的拆分、列数据合并和归档工作的自动化。这不仅节省了手动操作的时间,还能确保数据处理的高效和准确,提升工作效率和管理水平。

watwrmoon的博客 2560
上一篇: MediaPlayer Android 下播放 MP4 的问题
下一篇: 安卓APP的http访问权限
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值