小编csh*_*tor的帖子

如何比较包含非英语字符的unicode字符串以进行alpabetically排序?

我试图根据包含非英文字符的unicode字符串值对数组/列表/任何数据进行排序,我希望它们按字母顺序正确排序.

我写了很多代码(D2010,win XP),我认为这对于未来的国际化非常可靠,但事实并非如此.它全部使用unicodestring(string)数据类型,到目前为止我刚刚将英文字符放入unicode字符串中.

我似乎不得不承担起非常严重的unicode错误.我跟我的德国朋友聊了一下,尝试了一些德语ß,(ß是's',应该在S之后和T之前的字母表中)和ö等(注意变音符号),我的排序算法都不再适用了.结果非常混乱.垃圾.

从那以后,我一直在广泛阅读并学习了很多关于unicode整理的不愉快的事情.事情看起来很严峻,比我想象的要严重得多,我已经严重搞砸了.我希望我错过了一些东西,事情实际上并不像现在看起来那么严峻.我一直在修补Windows api调用(RtlCompareUnicodeString)没有成功(保护错误),我无法让它工作.我学到的API调用的问题是,他们在各种较新的Windows平台上进行了更改,并且很快就会使用delphi进行交叉平台,随后使用linux,我的应用程序是客户端服务器所以我需要关注这一点,但是这种情况是什么是不是(糟糕)我会感激任何前进的进步,即赢得api具体.

使用win api函数RtlCompareUnicodeString来明显解决方案吗?如果是这样的话,我应该再次尝试,但是我已经对unicode整理所涉及的所有问题感到吃惊,我不知道我应该采取什么方式来比较这些字符串.

我了解了IBM ICU c ++开源项目,虽然是旧版本的ICU,但它有一个delphi包装器.这似乎是一个非常全面的解决方案,它是独立于平台的.当然,我不能为此创建一个delphi包装器(或更新现有的包装器)以获得unicode整理的良好解决方案?

我很高兴听到两个层面的建议: -

A)Windows特定的非便携式解决方案,我很高兴此刻,忘记了客户端服务器的后果!B)一个更便携的解决方案,不受各种unicode api功能的各种XP/vista/win7变种的影响,因此使我在XE2 mac支持和未来的Linux支持方面处于有利地位,更不用说客户端服务器的复杂性了.

顺便说一句我真的不想做'make-do'解决方案,在比较之前扫描字符串并替换某些棘手的字符等,我已经读过了.我给出了上面的德语示例,这只是一个例子,我想让它适用于所有(或至少大多数,远东,俄语)语言,我不想为特定语言或两个语言做变通办法.我也不需要任何关于排序算法的建议,它们很好,它只是字符串比较位错了.

我希望我失踪/做一些愚蠢的事情,这一切看起来都很头疼.

谢谢.


编辑,鲁迪,这是我试图调用RtlCompareUnicodeString的方式.对不起,我已经度过了一段可怕的时光.

program Project26

{$APPTYPE CONSOLE}

uses
  SysUtils;


var
  a,b:ansistring;

  k,l:string;
  x,y:widestring;
  r:integer;

procedure RtlInitUnicodeString(
  DestinationString:pstring;
  SourceString:pwidechar) stdcall; external 'NTDLL';

function RtlCompareUnicodeString(
  String1:pstring;
  String2:pstring;
  CaseInSensitive:boolean
  ):integer stdcall; external 'NTDLL';


begin

  x:='wef';
  y:='fsd';

  RtlInitUnicodeString(@k, pwidechar(x));
  RtlInitUnicodeString(@l, pwidechar(y));

  r:=RtlCompareUnicodeString(@k,@l,false);

  writeln(r);
  readln;

end.
Run Code Online (Sandbox Code Playgroud)

我意识到这很可能是错的,我不习惯直接调用api notctions,这是我最好的猜测.

关于StringCompareEx api函数.这看起来真的很好,但只对Vista +有用,我正在使用XP.StringCompare是在XP上,但那不是Unicode!

回顾一下,基本任务是比较两个字符串,并根据当前Windows语言环境中指定的字符排序顺序进行比较.

任何人都可以肯定地说ansicomparetext是否应该这样做?它对我不起作用,但是其他人已经说过应该这样,而我读过的其他内容也表明应该这样做.

这是我在德语语言环境中使用AnsiCompareText时得到的31个测试字符串(空格分隔 - 没有字符串包含空格): -

  • arßAsßasßaßsnonööööoeoööööööööösössSSSaßßbßsßSasaSßbßßssssSSSSßßßssßßSSßßßzßzßzzzz

编辑2.

我仍然希望听到我是否应该期待AnsiCompareText使用区域设置信息,就像lkessler所说的那样,并且lkessler之前也发布了关于这些主题的内容,并且之前似乎已经完成了这些.

然而,根据Rudy的建议,我也一直在检查CompareStringW - 它与CompareString共享相同的文档,所以它不是我之前说过的非unicode.

即使AnsiCompareText无法工作,虽然我认为应该如此,但win32api函数CompareStringW确实可以工作.现在我已经定义了我的API函数,我可以调用它,我得到一个结果,没有错误......但是无论输入字符串如何,我每次都得到相同的结果!它每次返回1 - …

delphi unicode collation

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

对通过引用传递到proc的数组执行SetLength

当然,即使我能做到这一点......

var
  testarray : array of string;

setlength(testarray, 5);
Run Code Online (Sandbox Code Playgroud)

但是如果我想变得聪明并且有一个程序我通过这样的referance传递数组我无法做到!

procedure DoStuffWithArray(var passedarray : array of string);
begin
  setlength(passedarray, 5);
end;
Run Code Online (Sandbox Code Playgroud)

编译器在我的proc中的单行代码中说"不兼容的类型".

如果我在调用proc之前执行setlength,我可以在数组上执行其他内容,例如set set element values,但是我不能在proc中执行setlength,这就是我想要做的.

非常感谢任何帮助,谢谢大家.

delphi

16
推荐指数
1
解决办法
2929
查看次数

无法在Delphi 2010中获得前瞻性声明

我完全无法在Delphi 2010中获得类声明.我已经阅读了文档,在网上阅读,也许我是一个白痴,但我无法得到任何编译.任何帮助都将受到大力赞赏!

我敲了这两个米老鼠班.当然,我知道他们需要构造函数等来实际工作,它只是我正在解决的问题的演示.

我有MyParent类,其中包含我的其他类MyChild的TList.没关系.但是在MyChild中我希望能够设置对其父对象的引用,而不是TList而是MyParent类.

unit ForwardClassDeclarationTest;

interface

uses generics.collections;        

type
  MyChild = Class
  private
    ParentObect:MyParent;   <--I need to be able to make this accessable
  public
End;

type
  MyParent = Class
  public
    tlChildren:TList<MyChild>;
End;

implementation

end.
Run Code Online (Sandbox Code Playgroud)

我需要在这两个类之前创建一个前向声明,但我完全无法得到任何结果.提前感谢任何倾向于帮助我的人.

delphi

7
推荐指数
2
解决办法
5921
查看次数

我可以在IDE中使用TCP/IP运行程序并期望它们可以工作吗?

我只是冒险在Delphi 2010中编写我的第一个基于套接字的程序.我尝试使用Indy,没有成功,甚至只编写一个可以发送数据包的简单客户端和服务器.然后我使用TTCPServer和TTCPClient,使用以下"简单得到"演示相同的结果: -

Emmbercadero TTCPServer演示

Emmbercadero TTCPClient演示

我为客户端和服务器应用程序启动了2个IDE实例.我非常有信心避免发布与基于套接字的'helloworld'版本相关的问题的耻辱,我只花了2天时间尝试所有内容.

好吧,我刚刚决定把毛巾扔进去,请你帮忙,在我做之前,我只是从IDE外面运行exes ...是的,他们工作了!他们一直在工作,但不是从IDE内部工作.

我可以在IDE中成功运行这些程序吗?谢谢.

delphi delphi-2010

7
推荐指数
1
解决办法
520
查看次数

是否支持Delphi XE中的泛型类型?

我在D2010,我必须坚持到64位出来.

使用泛型,不支持指向泛型类型的指针,我发现它们确实非常有用.我在其他地方读过SO(2009年的帖子)巴里凯利爵士认为这可能会在未来发生变化.有谁知道XE是否支持这个?

如果没有,我真的希望他们进入XE2.

谢谢.

delphi delphi-xe

6
推荐指数
2
解决办法
1330
查看次数

是否可以在设计时直观地设计自定义组件?

我正冒险在Delphi中制作自己的组件.我很难开始组件开发.

我想制作复合控件,即由几个其他控件组成的控件,例如地址表单或类似的控件.

我是从TWinControl下降的.这会被认为是正确的选择吗?

最重要的是,我看不到在D2010中可视化设计组件的方法.这可能吗?例如,将一些文本框放到组件上,就像使用表单一样.我希望我不必将所有视觉方面的代码都交给我自己的组件.

此外,delphi组件开发的任何好链接都将非常受欢迎 - 尤其是复合控件.文件不是A1,它是一场斗争.我已经搜索了很多,我仍然无处可去.

delphi tframe delphi-2010

5
推荐指数
1
解决办法
1840
查看次数

如何避免TCustomGrid后代出现"抽象错误"?

从TCustomGrid下载一个新控件的最低限度是什么,并在IDE中的表单上获取它而不会在IDE中出现"抽象错误"?

我已经尝试了几天,但我有点像德尔福noob atm,TCustomGrid零成功率:(

如果有人可以帮助我只是获得TCustomGrid的基本后代,除了实现基本的TCustomGrid之外什么都不做,那将是非常值得赞赏的.谢谢.

编辑 - 我知道如何创建控件的基础知识,我只能用TCustomGrid来做

delphi

4
推荐指数
1
解决办法
1830
查看次数

标签 统计

delphi ×7

delphi-2010 ×2

collation ×1

delphi-xe ×1

tframe ×1

unicode ×1