2014-11-17 34 views
5

Próbuję porównać dwa ciągi na OSX w sposób niewrażliwy na wielkość liter przy użyciu AnsiSameText. To działało dobrze, ale na OS X Yosemite zachowuje się dziwnie, jeśli "preferowany język" OSX jest ustawiony na Holenderski ("Preferencje systemowe" -> "Język & Region" -> "Preferowane języki" -> "Nederlands Dutch ").Jak porównać tekst w sposób nieczuły na OSX Yosemite

W poniższym przykładzie kodu spodziewałbym się, że wydrukuje tylko "to samo". Ale dostaję "to samo, różne, różne".

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. 

Jaki jest prawidłowy sposób porównywania tekstów w sposób niewrażliwy na wielkość liter?

Używam Delphi XE7.

+0

To zachowanie jest wyraźnie błędne. Czy otrzymujesz te same wyniki w różnych wersjach Delphi? Różne wersje OSX? Co się dzieje, gdy debugujesz 'AnsiSameText'. Masz kod źródłowy do niego. –

+0

Podczas debugowania w AnsiSameText 'CFStringCompareWithOptionsAndLocale' zwraca -1. Na OSX 10.9 AnsiSameText działa zgodnie z oczekiwaniami. Próbowałem XE5 i XE7, nie powiedzie się w obu wersjach. Jak tylko zmieniłem język OS X 10.10 na angielski, AnsiSameText działa zgodnie z oczekiwaniami. Ale nie mogę powiedzieć moim holenderskim użytkownikom, aby zmieniali język swojego systemu operacyjnego. –

+1

Kolejnym krokiem jest napisanie programu Obj-C, który przekazuje te łańcuchy do 'CFStringCompareWithOptionsAndLocale' i spróbowanie zawęzić dokładnie tam, gdzie leży problem. Brzmi to trochę tak, jakby kluczowa była zmiana wersji OSX. Ale może być tak, że opakowanie Delphi wokół 'CFStringCompareWithOptionsAndLocale' zawsze było zepsute, a nowa wersja akurat podkreśla lukę. Możesz również przesłać swój przykładowy program do portalu jakości Delphi, aby dać Embie szansę spojrzenia na problem. Przy okazji +1 za wspaniałe MCVE. –

Odpowiedz

0

Delphi inicjuje UTF8CompareLocale z wartością zwróconą przez CFLocaleCopyCurrent. UTF8CompareLocale jest używane wewnątrz AnsiSameText dla ustawień regionalnych, które są używane do porównywania wielkości liter. Ale wtedy OSX Yosemite uważa "ja" i "i" inaczej, jeśli język OSX jest ustawiony na holenderski.

Wywołanie SetUTF8CompareLocale('en_US'); w systemie holenderskim rozwiązuje problem bez konieczności łatania jednostek Delphi.

+0

To nie rozwiązuje problemu. Po prostu sprawia, że ​​twój program używa angielskiego ustawienia narodowego. Dlaczego nie używasz domyślnego ustawienia narodowego. –

+0

Musiałbym załatać system.SysUtils za to. Jeśli przekażę zero lub CFLocaleGetSystem, wówczas OSX używa również angielskiej kolejności sortowania. (Spróbuj porównać "ait" i "aIt" z tureckim jako językiem podstawowym). Gdy zostanie użyty holenderski porządek sortowania, ja i ja jesteśmy różnymi literami. Więc to oczywiście nie jest opcja. –