标签: delphi-2009

当BOM(字节顺序标记)丢失时,如何最好地猜测编码?

我的程序必须读取使用各种编码的文件.它们可以是ANSI,UTF-8或UTF-16(大或小端).

当BOM(字节顺序标记)出现时,我没有问题.我知道文件是UTF-8还是UTF-16 BE或LE.

我想假设没有BOM文件是ANSI.但我发现我正在处理的文件经常缺少BOM.因此,没有BOM可能意味着该文件是ANSI,UTF-8,UTF-16 BE或LE.

当文件没有BOM时,扫描某些文件并最准确地猜测编码类型的最佳方法是什么?如果文件是ANSI,我希望接近100%的时间,如果是UTF格式,我希望接近100.

我正在寻找一种通用的算法来确定这一点.但实际上我使用Delphi 2009,它知道Unicode并且有一个TEncoding类,所以特定的东西将是一个奖励.


回答:

ShreevatsaR的回答让我在Google上搜索"通用编码检测器delphi",这让我感到惊讶,因为这个帖子在活着只有大约45分钟后被列为#1位置!这是快速googlebotting !! 同样令人惊讶的是Stackoverflow如此迅速地进入第一名.

Google的第二个条目是Fred Eaker关于字符编码检测的博客文章,列出了各种语言的算法.

我发现在该页面上提到了Delphi,它让我直接进入SourceForge的Free OpenSource ChsDet Charset Detector,这是用Delphi编写的,基于Mozilla的i18n组件.

太棒了!谢谢所有回复的人(全+1),谢谢ShreevatsaR,再次感谢Stackoverflow,帮助我在不到一个小时内找到答案!

delphi algorithm encoding byte-order-mark delphi-2009

29
推荐指数
2
解决办法
8026
查看次数

为什么默认情况下禁用DoubleBuffered?

创建新表单后,我通常会执行此仪式:

  1. 将名称更改为有意义的名称;
  2. 输入Caption;
  3. 更改位置属性(DefaultPosOnly几乎不是用户期望的);
  4. 设置ShowHinttrue;
  5. 设置DoubleBufferedtrue ;

我一直想知道为什么默认值为'False'.对我来说,它只是看起来低技术和蹩脚,在我的新机器上,我没有注意到性能上的任何差异.

在旧机器,VNC,远程桌面或虚拟机中双重缓冲是否有问题?

你把它打开还是关闭?有什么建议?

delphi doublebuffered delphi-2009

25
推荐指数
3
解决办法
1万
查看次数

Delphi是否为每个循环获得了一个?

我已经读过Delphi应该为Delphi 9中的每个循环得到一个.这个功能是否已经成为语言?我的Delphi 2009 IDE似乎无法识别每种语法.这是我的代码:

  procedure ProcessDirectory(p_Directory, p_Output : string);
  var
    files : TStringList;
    filePath : string;
  begin
    files := GetSubfiles(p_Directory);
    try
      for (filePath in files.Strings) do
      begin
        // do something
      end;

    finally
      files.Free;
    end;
  end;
Run Code Online (Sandbox Code Playgroud)

delphi foreach delphi-2009

24
推荐指数
2
解决办法
4万
查看次数

如何指定MSbuild输出文件夹?

当我使用MSBuild命令行执行delphi 2009项目时,输出总是转到C:驱动器

C:\MyProjects>MSbuild "C:\MyTestProject\Test.dproj" /t:Build /p:OutDir="C:\Output\bin\"
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

谢谢和问候,帕万.

delphi msbuild delphi-2009

23
推荐指数
2
解决办法
3万
查看次数

RAD Studio 2009持久选择问题:错误还是功能?

有时,在RAD Studio 2009(Delphi)中进行编码时,代码编辑器的行为会发生变化.在这样的事件之后,在字符输入上不再清除选择.这通常发生在非常激烈的编码会话(每秒很多字符!)之后,所以我可能会意外地击中键盘(快捷方式)组合.

是这样的吗?如何"修复"这个问题?(我希望我的选择能够在字符输入时得到解决!)

delphi delphi-2009 selection code-editor

22
推荐指数
1
解决办法
733
查看次数

在Delphi 2009中将字符串转换为PAnsiChar

我正在将我的应用程序转换为Delphi 2009,并且遇到了一些需要将字符串(宽)转换为AnsiString的调用的有趣问题.

这是一个展示我遇到的问题的例子:

var
  s: PAnsiChar;

...

s := PAnsiChar(Application.ExeName);
Run Code Online (Sandbox Code Playgroud)

使用Delphi 2007和以前的版本,s:= PChar(Application.ExeName)将返回应用程序exe路径.

使用Delphi 2009,s:= PAnsiChar(Application.ExeName)仅返回'E'.

我的猜测是因为我正在将unicode字符串转换为ansi字符串,但是如何将其转换为PAnsiChar获取完整字符串?

delphi delphi-2009

21
推荐指数
2
解决办法
8万
查看次数

如何从类引用创建Delphi对象并确保构造函数执行?

如何使用类引用创建对象的实例,并确保执行构造函数?

在此代码示例中,将不会调用TMyClass的构造函数:

type
   TMyClass = class(TObject)
     MyStrings: TStrings;
     constructor Create; virtual;
   end;

constructor TMyClass.Create;
begin
   MyStrings := TStringList.Create;
end;

procedure Test;
var
   Clazz: TClass;
   Instance: TObject;
begin
   Clazz := TMyClass;
   Instance := Clazz.Create;
end;
Run Code Online (Sandbox Code Playgroud)

delphi constructor reference class delphi-2009

20
推荐指数
4
解决办法
4万
查看次数

Delphi中的外部异常EEFFACE

在使用Delphi 2009调试我的应用程序时,我有时会发生以下异常:

这是什么?http://www.beholdgenealogy.com/img/ideexception.gif

这只是偶尔发生,但在按下OK之后,我的IDE和程序都可能会冻结.如果我很幸运,我有时可以在Delphi中进行File/SaveAll,但有时候我不能.无论哪种方式我都被卡住,然后我唯一能做的就是使用Windows任务管理器来关闭Delphi.当然,如果我无法SaveAll,那么我将丢失自上次保存以来所做的所有编辑.

我安装了所有Delphi 2009更新,包括Update 4.我还安装了IDE Fix Pack 2009 2.9.

EurekaLog为我捕获了错误,错误报告给出了以下调用堆栈:

Call Stack Information:
-----------------------------------------------------------------------------------------------------------
|Address |Module              |Unit               |Class             |Procedure/Method          |Line     |
-----------------------------------------------------------------------------------------------------------
|Running Thread: ID=5068; Priority=0; Class=; [Main]                                                      |
|---------------------------------------------------------------------------------------------------------|
|205669C6|dbkdebugide120.bpl  |Debug.pas          |TDebugger         |DBKWndProc                |11598[6] |
|777DE49A|ntdll.dll           |                   |                  |KiUserExceptionDispatcher |         |
|7705E0CB|kernel32.dll        |                   |                  |RaiseException            |         |
|03E8E3E8|dcc120.dll          |WRITEOBJ.OBJ       |                  |C62_0                     |         |
|03E3066D|dcc120.dll          |SYMTAB.OBJ         |                  |MakeOverloadedPropertyList|         |
|03E3064C|dcc120.dll          |SYMTAB.OBJ         |                  |MakeOverloadedPropertyList|         |
|03E30D76|dcc120.dll          |SYMTAB.OBJ         |                  |EnterMethod               |         |
|03E30D6C|dcc120.dll          |SYMTAB.OBJ         |                  |FindBaseClassMethod       |         |
|03DE8D30|dcc120.dll          |DECL.OBJ …
Run Code Online (Sandbox Code Playgroud)

ide delphi exception delphi-2009

19
推荐指数
1
解决办法
2万
查看次数

如何在Delphi 2009中按键按字母顺序列出TDictionary?

如何使用TEnumerator按键排序顺序浏览我的TDictionary?

我有这样的事情:

  var
    Dic: TDictionary<string, string>;
    Enum: TPair<string, string>;

  begin
    Dic := TDictionary<string, string>.create;
    Dic.Add('Tired', 'I have been working on this too long');
    Dic.Add('Early', 'It is too early in the morning to be working on this');
    Dic.Add('HelpMe', 'I need some help'); 
    Dic.Add('Dumb', 'Yes I know this example is dumb');

   { I want to do the following but do it in sorted order by Enum.Key }
    for Enum in Dic do
      some processing with Enum.Key and Enum.Value;

    Dic.Free;
  end;
Run Code Online (Sandbox Code Playgroud)

所以我想按顺序处理我的字典:Dumb,Early,HelpMe,Tired.

不幸的是,Delphi帮助在描述一般的枚举器和TEnumerator如何具体工作方面是非常小的,并没有给出我能找到的例子.关于在Delphi中使用带有泛型的枚举器,网上也很少写. …

delphi generics delphi-2009 tdictionary

19
推荐指数
3
解决办法
2万
查看次数

货币价值/常数价值比较的奇怪结果

当使用Delphi 2009编译并运行时,此控制台应用程序会写"奇怪"."小于"运算符两边的值相等,但代码的行为就好像它们不相等.我该怎么做才能避免这个问题?

program Project5;

{$APPTYPE CONSOLE}

var
  C: Currency;
begin
  C := 1.32;

  if C < 1.32 then
  begin
    WriteLn('strange');
  end;

  ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)

ps代码适用于其他值.

答案由巴里·凯利解释说,货币型"是不容易的浮点代码是相同的方式精度的问题."

delphi compare delphi-2009

18
推荐指数
2
解决办法
1309
查看次数