我的程序必须读取使用各种编码的文件.它们可以是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,帮助我在不到一个小时内找到答案!
创建新表单后,我通常会执行此仪式:
Caption;ShowHint到true;DoubleBuffered到true ; 我一直想知道为什么默认值为'False'.对我来说,它只是看起来低技术和蹩脚,在我的新机器上,我没有注意到性能上的任何差异.
在旧机器,VNC,远程桌面或虚拟机中双重缓冲是否有问题?
你把它打开还是关闭?有什么建议?
我已经读过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) 当我使用MSBuild命令行执行delphi 2009项目时,输出总是转到C:驱动器
C:\MyProjects>MSbuild "C:\MyTestProject\Test.dproj" /t:Build /p:OutDir="C:\Output\bin\"
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
谢谢和问候,帕万.
有时,在RAD Studio 2009(Delphi)中进行编码时,代码编辑器的行为会发生变化.在这样的事件之后,在字符输入上不再清除选择.这通常发生在非常激烈的编码会话(每秒很多字符!)之后,所以我可能会意外地击中键盘(快捷方式)组合.
是这样的吗?如何"修复"这个问题?(我希望我的选择能够在字符输入时得到解决!)
我正在将我的应用程序转换为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获取完整字符串?
如何使用类引用创建对象的实例,并确保执行构造函数?
在此代码示例中,将不会调用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 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) 如何使用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 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 ×10
delphi-2009 ×10
algorithm ×1
class ×1
code-editor ×1
compare ×1
constructor ×1
encoding ×1
exception ×1
foreach ×1
generics ×1
ide ×1
msbuild ×1
reference ×1
selection ×1
tdictionary ×1