我正在尝试排序数组/列表/任何数据基于unicode字符串值包含非英文字符,我希望他们按字母顺序排序。

我写了很多代码(D2010,win XP),我认为这对于未来的国际化来说是非常稳固的,但不是。它全部使用unicodestring(string)数据类型,到目前为止,我刚刚把英文字符放入unicode字符串。

似乎我必须拥有一个非常严重的unicode错误。我跟德国朋友谈过,并尝试了一些德国的ß,(ß是’ss’,应该是S和T之后的字母表)和ö等(注意umlaut),我的排序算法都没有工作了。结果非常混乱。垃圾。

从那时起,我一直在阅读广泛,并学习了很多关于unicode整理的不愉快的事情。事情看起来很严峻,比以前预想的要严峻,我已经把这个弄得很厉害了。我希望我错过了一些东西,事实上并不像现在看起来那么严峻。我一直在琢磨着看着windows api调用(RtlCompareUnicodeString),没有成功(保护错误),我无法让它工作。 API调用的问题我学到的是,它们在各种较新的Windows平台上发生变化,并且随着delphi的跨平台也越来越快,随着linux,我的应用程序是客户端服务器,所以我需要关心这一点,但是,是(坏)我会感激任何进步,即胜利api具体。

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

我了解到IBM ICU c opensource项目,但是有一个delphi包装器,尽管是旧版本的ICU。这似乎是一个非常全面的解决方案,是平台独立的。当然,我无法看到为此创建一个delphi包装(或更新现有的),以获得unicode整理的一个很好的解决方案?

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

A)一个Windows特定的非便携式解决方案,我会很高兴,目前,忘记了客户端服务器的后果!
B)一个更便携的解决方案可以免除unicode api功能的各种XP / vista / win7变体,因此使我在XE2 mac支持和未来的linux支持方面取得了很好的成绩,更不用说客户端服务器的并发症。

Btw我真的不想做’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.

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

关于你的StringCompareEx api函数。这看起来真的很好,但仅在Vista上使用,我正在使用XP。 StringCompare是在XP,但这不是Unicode!

要概述,基本任务是比较两个字符串,并根据当前窗口区域设置中指定的字符排序顺序进行比较。

如果ansicomparetext应该做到这一点吗?这对我来说并不奏效,但是有些人说应该这样做,其他我看过的建议应该是这样的。

当在德语区域设置中使用AnsiCompareText时,这是31个测试字符串所得到的(空格分隔 – 没有字符串包含空格): –

>ßßßöööööööööööss ss ss ss ss ss a a a a a a a
Sssbßßssss SSSSßßßssßßSSßßßzßzßz zzz

编辑2。

我还是很想知道如果我应该期望AnsiCompareText使用locale信息工作,就像lkessler所说的那样,lkessler也已经发布了关于这些主题的信息,并且似乎已经通过了这一点。

不过,从Rudy的建议来看,我也一直在检查CompareStringW – 它与CompareString共享相同的文档,所以它不是非Unicode的,如前所述。

即使AnsiCompareText不工作,虽然我认为应该是,win32api函数CompareStringW应该确实有效。现在我已经定义了我的API函数,我可以调用它,我得到一个结果,没有错误…但我得到相同的结果,无论输入字符串!它每次返回1 – 这意味着少于。这是我的代码

var
  k,l:string;

function CompareStringW(
  Locale:integer;
  dwCmpFlags:longword;
  lpString1:pstring;
  cchCount1:integer;
  lpString2:pstring;
  cchCount2:integer
  ):integer stdcall; external 'Kernel32.dll';

begin;

  k:='zzz';
  l:='xxx';

  writeln(length(k));
  r:=comparestringw(LOCALE_USER_DEFAULT,@k,3,3);

  writeln(r); // result is 1=less than,2=equal,3=greater than
  readln;

end;

我觉得我现在有了很多痛苦。很高兴知道AnsiCompareText,而且我在上面的CompareStringW api调用中做错了什么。谢谢。

编辑3

首先,我自己修改了比较字符串的API调用,当我应该做PString(mystring)时,我传递了@mystring。现在这一切都正常工作。

r:=comparestringw(LOCALE_USER_DEFAULT,pstring(k),-1,pstring(l),-1);

现在,我可以想象我的沮丧,当我仍然得到了一样的排序结果,因为我一开始就这样做

>ßßßßßßßßööööööööööss ss ss a a a a a a a a a a
Sssbßßssss SSSSßßßssßßSSßßßzßzßz zzz

当我意识到排序顺序是正确的时候,你也可能会想象我非常沮丧,不要提及同时的快乐,而且它在正确的位置正确地回到了!这使得生病的人说,但是从来没有任何问题,这一切都归功于我缺乏德国的知识。我觉得排序是错误的,因为你可以看到上面的字符串从S开始,然后他们从ß开始,然后再次回到ß等等。那么我不会说德语,但是我仍然可以清楚地看到他们没有被正确排序 – 我的德国朋友告诉我,ß来自S,之前,我错了!发生的是字符串函数(AnsiCompareText和winapi CompareTextW)都使用’ss’替代每个’ß’,并且每个’ö’都具有正常的’o’…所以如果我把这些结果和搜索结果并按照我所描述的替换

>屁股屁股屁股Asss no no o on oo oo ooo ooo op po ss ss ss ss ssss
sss Sssa Sssb ssss ssss SSSS ssssss ssssss SSssss ssz sszss z zzz

对我来说看起来很正确!而且它一直是。

我非常感谢所有的建议,非常抱歉浪费了你这样的时间。那些德国人的ß让我感到困惑,内置delphi功能或其他任何东西都没有错。它只是看起来像那里。在我的测试数据中,我错误地将它们与正常的’组合在一起,任何其他的信都不会产生这种无序排除的错觉!波澜不惊的ß使我看起来很傻! SSS!

Rudy和lkessler我们都特别有帮助,我们都不得不接受lkessler的答案是最正确的,对不起Rudy。

解决方法

尝试使用 CompareStr区分大小写,如果您希望在任何区域设置完全相同,则使用 CompareText不区分大小写。

并且使用AnsiCompareStr区分大小写,如果您希望您的排序特定于用户的区域设置,则使用AnsiCompareText不区分大小写。

有关这方面的更多信息,请参阅:How can I get TStringList to sort differently in Delphi。

delphi – 如何比较包含非英文字符的unicode字符串进行排序?的更多相关文章

  1. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  2. ios – Swift:如何从不同的swift文件中调用函数

    我的Xcode6beta-2项目中有多个类型为UIViewController的swift文件.我基本上想知道文件A中的一些数据在文件B中使用.我的文件都是UIViewControllers,我创建了一个没有参数的函数,它返回UIViewController_A中的字符串.当我尝试在UIViewController_B中调用所述函数时,intellisense为我填写,但是我必须有一个自动填充为U

  3. ios – 如何使用Unicode十六进制值(UTF-16)在Swift中表达字符串

    我想在Swift中使用十六进制值编写一个Unicode字符串.我已经阅读了字符串和字符的documentation,所以我知道我可以使用特殊的Unicode字符直接在字符串如下:版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  4. ios – 如何使用SwiftyJSON将字符串转换为JSON

    要转换的字符串:[{“description”:“Hi”,“id”:2,“img”:“hi.png”},{“description”:“pet”,“id”:10,“img”:“pet.png“},{”description“:”Hello!:D“,”id“:12,”img“:”hello.png“}]转换字符串的代码:varjson=JSON该字符串转换为JSON,当我尝试计算这个JSON里面有多少个块时,我得到0.打印控制台输出:0我失踪了什么帮助非常感激.解决方法实际上,在SwifyJSON中有一个内

  5. ios – 将两个字符串转换为一组布尔值的快速方法是什么?

    我有一个长字符串,我想转换为一个布尔值数组.而且它需要很多次,很快.我天真的尝试是这样的:但这比我想要的要慢很多.我的剖析告诉我,地图是减速的地方,但我不知道我能做多么简单.我觉得如果没有Swift’s/ObjC的开销,这样做会很快.在C中,我认为这是一个简单的循环,其中一个字节的内存与一个常量进行比较,但我不知道我应该看的是什么函数或语法.有更好的办法吗?

  6. ios – 我在哪里可以找到用于创建IPad应用程序的Delphi资源?

    我之前一直在使用Delphi并且一直都是Windows家伙.我的妻子为我的生日买了一台新的iPad,我昨晚第一次使用它.哇!…

  7. ios – 按键键入字典的Swift排序数组,其中value是可选的AnyObject

    我正在直接从Parse中提取一系列字典并将它们显示在表格中.所以我真的很想处理我所掌握的数据结构.PFObject是[String:AnyObject?解决方法Swift无法比较任何两个对象.您必须先将它们转换为特定类型:如果有多个字典没有指定键的值,它们将被放置在结果数组的末尾,但它们的相对顺序是不确定的.

  8. 如何从命令行部署OSX或IOS Delphi项目?

    我正在使用像这样的脚本构建我的Delphi应用程序现在我想添加一个选项将应用程序部署到OSX系统修改这样的脚本,那么可以从命令行部署OSX或IOSDelphi项目吗?

  9. 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 05 Strings and Characters

    Swift所代表的字符串是字符串类型,进而代表字符类型的值的集合//Swift的String和Character类型提供了一个快速的,兼容Unicode的方式来处理代码中的文本信息。每一个字符值代表一个Unicode字符,我们可以利用for-in循环来遍历字符串中的每一个字符println}//定义一个字符常量letyenSign:Character="$"printlncharacters")//使用"countElements()"函数来获取字符串的长度//8.ConcatenatingStrings

  10. String 与 NSString 的区别

    Swift的String类型与FoundationNsstring类进行了无缝桥接。在日常开发中,绝大多数应该用StringString与Nsstring还有以下区别String类型是值类型,字符串在进行常量、变量赋值操作或在函数/方法中传递时,会进行值拷贝。任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。String可以支持字符遍历Nsstring不支持String是一个结构体,性能更高;Nsstring是一个NSObject对象,性能相对会差现在还有一些功能,用String不

随机推荐

  1. delphi – 主窗口按进程名称处理

    DelphiXe,Win7x64如何从进程名称(exe文件的完整路径)获取主窗口句柄,或至少一个类或窗口名称(如果该进程只有一个窗口).例:解决方法我同意Petesh的说法,你需要枚举顶级窗口并检查创建它的进程的模块文件名.为了帮助您开始枚举顶级窗口,这是一个delphi实现.首先,当你回调给你时,你需要一些与EnumWindows方法通信的方式.为此声明一条记录,该记录将保存您要查找的模块的文件

  2. 如何在Delphi中纯粹通过RTTI信息(即不使用任何实际对象实例)获取TObjectList的子项类型?

    我正在使用RTTI实现用于流式传输任意Delphi对象的通用代码,并且为了使其工作(更具体地说,为了使加载部分工作),我需要以某种方式获得TObjectList的子项类型<T>不使用任何实际对象实例的字段.要求不使用任何实际对象实例的明显原因是,在从流加载对象的情况下(仅基于要加载的对象的类类型的知识),我将不会有任何实例在加载完成之前完全可用–我宁愿只能访问相关类的纯RTTI数据.我希望能

  3. inno-setup – Inno Setup – 安装程序背景图片

    图像作为安装程序背景如何用inno5.5.9做到这一点?

  4. inno-setup – Inno Setup – 如何添加多个arc文件进行解压缩?

    使用InnoSetup解压缩弧文件.我希望有可能解压缩多个arc文件以从组件选择中安装文件(例如).但仍然显示所有提取的整体进度条.这可能吗?的回答的修改预备是相同的,参考其他答案.在ExtractArc中,为要提取的每个存档调用AddArchive.

  5. delphi – 如何在DataSet的帮助下在TAdvStringGrid中显示数据库中的BLOB图像

    解决方法CreateBlobStream正在创建一个TStream对象,而不是TMemoryStream.由于您不想将JPG写入数据库,因此应使用bmRead而不是bmReadWrite.我不习惯sqlite,但你必须确保使用合适的二进制日期类型.为了确保存储的图像真的是JPG,您应该编写JPG以进行测试,例如:

  6. inno-setup – 在Inno Setup的Code部分下载程序后运行程序

    如何运行我通过Internet下载的应用程序,在代码部分中使用,并等待该应用程序完成运行.我有,使用InnoTools下载程序,下载这两个文件,我想,在第二个完成下载后运行该下载,或jdk-8u111-windows-x64.exe,然后继续安装.解决方法使用其他下载插件,而不是ITD(请参阅下面的原因).例如,InnoDownloadPlugin.当您包含idp.iss时,它定义了一个全局IDP

  7. progress-bar – Inno Setup Run部分的简单进度页面

    我的安装程序非常简单,它基本上是:>欢迎页面>进展页面>最终页面欢迎页面和最终页面是标准页面.在Progress页面,我正在静默安装一堆其他程序.实际的脚本是在[Run]部分中安装每个程序.问题是酒吧达到100%然后停留在那里.我只能更改消息文本.我想要实现的是使用Pascal脚本显示进度,例如:这样我就可以显示更准确的进度条.这就是我所拥有的:问题是,当我构建安装程序时,它不显示欢迎页面.我做错了什么?

  8. delphi – 如何使“显示/隐藏桌面图标”设置生效?

    下面的代码调用SHGetSetSettings函数来隐藏桌面图标但它只是从视图菜单中取消选中“显示桌面图标”.我打电话给SHChangeNotify;更新桌面,但这不起作用?解决方法isa,要刷新桌面,您可以将F5键发送到progman窗口隐藏桌面图标的另一种方法是再次显示

  9. inno-setup – Inno Setup – 避免显示子安装程序的文件名

    我试图使用InnoSetup–Howtohidecertainfilenameswhileinstalling?(FilenameLabel)的想法Theonlysuresolutionistoavoidinstallingthefiles,youdonotwanttoshow,usingthe[Files]section.Installthemusingacodeinstead.UsetheEx

  10. inno-setup – Inno Setup磁力链接下载实施

    我目前正在使用InnoDownloadPlugin为我的安装程序下载文件,这个问题最大的问题是faila正确下载文件.因为连接不良等诸多原因.我想添加一种替代方法来下载文件,因此用户可以选择是否需要常规方式或torrent方式.我知道我可以使用aria2c.exe应用程序(https://aria2.github.io/),有人可以帮我实现它的inno设置代码吗?我需要的是使用torrent(ar

返回
顶部