首页 > 其他分享 >【原创】修复freeepascal自带的tdbf组件使用中文字段时转换为utf8时可能出现文字错的问题

【原创】修复freeepascal自带的tdbf组件使用中文字段时转换为utf8时可能出现文字错的问题

时间:2024-10-12 20:21:19浏览次数:5  
标签:文字 object end utf8 Top 段时 TForm1 Dbf1 Left

修复freeepascal自带的tdbf组件字段名称使用中文时转换为utf8时可能出现文字错:

修改方法:

打开fpcsrc\packages\fcl-db\src\dbase\dbf_dbffile.pas
修改第816/1236/1246/1842/2758行,将AnsiUpperCase改为UpperCase。
重新编译fpcsrc源码或将dbase文件夹拷贝到project目录,重新编译project
测试代码:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, dbf, DB, Forms, Controls, Graphics, Dialogs, DBGrids,lazutf8,
  StdCtrls, LConvEncoding;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    Dbf1: TDbf;
    dbgrid1 : tdbgrid;
    Memo1: TMemo;

    function Dbf1Translate(Dbf: TDbf; Src, Dest: PChar; ToOem: Boolean
      ): Integer;
    procedure FormCreate(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
  dbf1.Open;
  caption := inttostr(dbf1.CodePage);

  for i := 0 to Dbf1.Fields.Count-1 do
  begin
   if Dbf1.Fields[i] is TStringField then
        TStringField(Dbf1.Fields[i]).Transliterate := true;
   memo1.Lines.Add(CP936ToUTF8(dbf1.Fields[i].FieldName));
   dbgrid1.Columns[i].Title.Caption:=CP936ToUTF8(dbf1.Fields[i].FieldName);
  end;
end;

function TForm1.Dbf1Translate(Dbf: TDbf; Src, Dest: PChar; ToOem: Boolean
  ): Integer;
begin
  StrCopy(Dest, PChar(CP936ToUTF8(Src)));
  Result := StrLen(Dest);
end;

end.
object Form1: TForm1
  Left = 405
  Height = 804
  Top = 250
  Width = 1524
  Caption = 'Form1'
  ClientHeight = 804
  ClientWidth = 1524
  DesignTimePPI = 144
  OnCreate = FormCreate
  object DBGrid1: TDBGrid
    Left = 0
    Height = 408
    Top = 0
    Width = 1524
    Align = alClient
    Color = clWindow
    Columns = <>
    DataSource = DataSource1
    TabOrder = 0
  end
  object Memo1: TMemo
    Left = 0
    Height = 396
    Top = 408
    Width = 1524
    Align = alBottom
    Lines.Strings = (
      'Memo1'
    )
    TabOrder = 1
  end
  object Button1: TButton
    Left = 1284
    Height = 38
    Top = 480
    Width = 112
    Caption = 'Button1'
    TabOrder = 2
  end
  object Dbf1: TDbf
    DateTimeHandling = dtDateTime
    FilePath = 'C:\Users\szlbz\Downloads\dbfTest\'
    IndexDefs = <>
    TableName = '区划信息.dbf'
    TableLevel = 30
    UseAutoInc = True
    OnTranslate = Dbf1Translate
    FilterOptions = []
    Left = 180
    Top = 108
  end
  object DataSource1: TDataSource
    DataSet = Dbf1
    Left = 60
    Top = 108
  end
end

修改后编译的demo:

 

标签:文字,object,end,utf8,Top,段时,TForm1,Dbf1,Left
From: https://www.cnblogs.com/qiufeng2014/p/18461436

相关文章

  • 文字转语音软件有哪些?5款实用软件让你轻松制作音频
    说到智能配音软件,你肯定也有过这样的时刻:眼睛盯着屏幕,文字像蚂蚁一样爬来爬去,就是不想读。或者,你的眼睛已经疲惫不堪,但工作还得继续。这时候,一款好的智能配音软件就能派上大用场了。它能帮你把枯燥的文字变成生动的语音,让你的耳朵也能享受阅读的乐趣。但市面上的选择那么多,智......
  • PyQt5/6 PySide2/6 在任务栏托盘区域编程,用于显示文字(图片)信息
    PyQt5/6PySide2/6在任务栏编程,用于显示文字(图片)信息本文使用PyQt5演示,其他库如PySide2/6,稍微改改就能用,因为其核心使用的是Win32gui来获取一些系统信息代码结构本文中全部代码全在test_taskbar.py这一个文件中编码,步骤中有变动的地方会注释标注,无改动的不会重复显示出来,需要......
  • 检测字体文件中不支持哪些字符字形;传入一段文字内容,返回字体包不支持的字符
    constpackage=require('../package');constfs=require('fs');constopentype=require('opentype.js');functionfindUnsupportedChars(fontPath,text){constfont=opentype.loadSync(fontPath);constunsupportedCha......
  • 开关打开输入框才能输入文字,否则为禁用状态
    页面开关默认为关闭状态,输入框为禁用状态。当点击开关,打开开关后,输入框禁用状态解除,才可以在输入框内输入。html结构:<divclass="page_top"> <!--第一行--> <divclass="top_first"> <divclass="shangwu">上午</div> <divcla......
  • 获取字符串的在html页面上的宽度并且若文字过长则缩小字体填充
    某个页面有这样一个需求:一个固定宽度的div,若文字过长,则缩小字体填充。看到同事采用的是用php的GD库的imagettfbbox函数来计算文字的宽度。imagettfbbox(float $size,float $angle,string $font_filename,string $string,array $options=[]): array|false 取得使用Tru......
  • 网站模板怎么修改文字内容
    修改网站模板的文字内容相对简单,主要涉及对HTML文件的编辑。以下是详细的步骤:备份现有文件:在开始修改之前,务必先备份当前的网站文件,以防意外丢失数据。选择合适的编辑工具:使用代码编辑器如VSCode、SublimeText或者Notepad++等工具打开模板文件。熟悉模板结......
  • 如何修改模板上面内容文字
    要修改模板上的内容文字,通常可以按照以下步骤操作:定位模板文件:首先找到存储模板的文件位置。模板可能是HTML文件、Word文档、PPT幻灯片或其他类型的文件。打开编辑工具:使用相应的编辑工具打开模板文件。例如,HTML模板可以用任何文本编辑器或IDE打开;Word或PPT模板则需要使用Of......
  • 用文字“画出”流程图:用 AI+Mermaid.js 构建出你心中的可视化世界
    Mermaid介绍首先,什么是Mermaid?Mermaid.js是一款开源流程图/序列图的文本制作工具,它允许你使用简单的文本语法来创建各种类型的图表。无论你是开发者、学生还是普通用户,Mermaid.js都能帮助你将复杂的信息以直观、易懂的方式呈现出来。在AI技术的加持下,Mermaid现已支持......
  • 公司网站出现文字乱码
    解决公司网站出现文字乱码的问题,通常需要从以下几个方面进行检查和处理:确认字符编码设置检查网页的HTML头部是否正确设置了字符编码,如<metacharset="UTF-8">。确认服务器端返回给浏览器的内容类型(Content-Type)头信息中是否包含了正确的字符集声明。数据库字符集配置......
  • TTS技术:让文字发声的魔法
    TTSTTS技术:让文字发声的魔法在这个信息爆炸的时代,我们每天都在接触大量的文字信息。但是,对于视力障碍者、学习障碍者或者需要多任务处理的人来说,阅读大量文字可能是一项挑战。这时候,文本转语音(Text-to-Speech,简称TTS)技术就成为了一个强大的工具,它可以将文字转换成自然......