如何在OSX Yosemite上不区分大小写地比较文本

5
我正在尝试使用AnsiSameText在OSX上以不区分大小写的方式比较两个字符串。这曾经很好地工作,但在OSX Yosemite上,如果OSX的“首选语言”设置为荷兰语(“系统偏好设置” ->“语言和地区” ->“首选语言” ->“Nederlands Dutch”),则会出现奇怪的行为。
在以下代码示例中,我希望它只打印“same”。但我得到“same,different,different”。
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

begin
  if AnsiSameText('abcde', 'ABCDE') then // Same
    WriteLn('Same')
  else
    WriteLn('Different');

  if AnsiSameText('abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') then // different
    WriteLn('Same')
  else
    WriteLn('Different');

  if AnsiSameText('i', 'I') then // different
    WriteLn('Same')
  else
    WriteLn('Different');
end.

如何以不区分大小写的方式比较文本?

我正在使用Delphi XE7。


那种行为显然是错误的。您在不同版本的Delphi上获得相同的输出吗?在不同版本的OSX上呢?当您调试AnsiSameText时会发生什么?您确实拥有它的源代码。 - David Heffernan
当调试进入 AnsiSameText 时,CFStringCompareWithOptionsAndLocale 返回 -1。在 OSX 10.9 上,AnsiSameText 的工作正常。我尝试了 XE5 和 XE7,在这两个版本上都失败了。只要我将 OSX 10.10 的语言更改为英语,AnsiSameText 就能正常工作。但我不能告诉我的荷兰用户切换他们的操作系统语言。 - Sebastian Z
1
下一步是编写一个Obj-C程序,将这些字符串传递给CFStringCompareWithOptionsAndLocale,并尝试缩小问题所在的范围。听起来好像OSX版本更改是关键。但也可能是Delphi包装器周围的CFStringCompareWithOptionsAndLocale一直存在问题,而新版本只是突出了这个缺陷。您还可以将示例程序提交到Delphi质量门户,以便EmbA有机会查看该问题。顺便说一句,+1超级MCVE。 - David Heffernan
我可能会查看在调用CFStringCompareWithOptionsAndLocale时使用UTF8CompareLocale的情况。我想知道如果你传递nil而不是UTF8CompareLocale会发生什么。 - David Heffernan
1
@Hans 不是的。这些函数命名不太好。它们是区域设置感知比较函数。 - David Heffernan
显示剩余3条评论
1个回答

0

Delphi使用CFLocaleCopyCurrent返回的值初始化UTF8CompareLocale。UTF8CompareLocale在AnsiSameText中用于区分大小写比较所使用的语言环境设置。但是,如果OSX的语言设置为荷兰语,则OSX Yosemite会将"I"和"i"视为不同。

在荷兰语系统上调用SetUTF8CompareLocale('en_US');可以解决问题,而无需修补Delphi单元。


那并不能解决问题,它只是让你的程序使用英语区域设置。为什么不使用默认区域设置呢? - David Heffernan
我需要对 System.SysUtils 进行打补丁才行。如果我传入 nil 或 CFLocaleGetSystem,那么 OSX 也会使用英文排序方式。(尝试使用土耳其语作为主要语言比较“ait”和“aIt”)。一旦使用荷兰排序方式,i 和 I 就成为了不同的字母。所以,这显然不是一个选项。 - Sebastian Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接