2014-11-17 10 views
5

Sto provando a confrontare due stringhe su OSX in modo insensibile al maiuscolo/minuscolo utilizzando AnsiSameText. Funzionava bene, ma su OSX Yosemite questo si comporta in modo strano se la "lingua preferita" di OSX è impostata su olandese ("Preferenze di sistema" -> "Lingua & Regione" -> "Lingue preferite" -> "Nederlands Olandese ").Come confrontare il testo in modo non sensibile al maiuscolo/minuscolo su OSX Yosemite

Nel seguente esempio di codice mi aspetto che stampi solo "uguale". Ma ottengo "lo stesso, diverso, diverso".

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. 

Qual è il modo corretto di confrontare i testi in modo non sensibile al maiuscolo/minuscolo?

Sto usando Delphi XE7.

+0

Questo comportamento è chiaramente sbagliato. Hai lo stesso risultato su diverse versioni di Delphi? Diverse versioni di OSX? Cosa succede quando esegui il debug di 'AnsiSameText'. Hai il codice sorgente per questo. –

+0

Quando esegue il debug in AnsiSameText 'CFStringCompareWithOptionsAndLocale' restituisce -1. Su OSX 10.9 AnsiSameText funziona come previsto. Ho provato XE5 e XE7, non funziona su entrambe le versioni. Non appena cambio la lingua di OSX 10.10 in inglese, AnsiSameText funziona come previsto. Ma non posso dire ai miei utenti olandesi di cambiare la lingua del loro sistema operativo. –

+1

Il passo successivo è scrivere un programma Obj-C che passa queste stringhe a 'CFStringCompareWithOptionsAndLocale' e tenta di restringere esattamente dove si trova il problema. Sembra un po 'come se la modifica della versione di OSX sia la chiave qui. Ma potrebbe essere che il wrapper Delphi di 'CFStringCompareWithOptionsAndLocale' sia sempre stato rotto e la nuova versione capita proprio per evidenziare il difetto. Puoi anche inviare il tuo programma di esempio al portale di qualità Delphi per dare a Emba la possibilità di esaminare il problema. Btw, +1 per un superbo MCVE. –

risposta

0

Delphi inizializza UTF8CompareLocale con il valore restituito da CFLocaleCopyCurrent. UTF8CompareLocale viene utilizzato all'interno di AnsiSameText per le impostazioni internazionali utilizzate per il confronto senza distinzione tra maiuscole e minuscole. Ma allora OSX Yosemite considera "I" e "i" diversi se la lingua di OSX è impostata su Olandese.

Chiamare SetUTF8CompareLocale('en_US'); su un sistema olandese risolve il problema senza dover applicare patch alle unità Delphi.

+0

Questo non risolve il problema. Fa in modo che il tuo programma usi le impostazioni locali in inglese. Perché non usi le impostazioni internazionali predefinite. –

+0

Mi piacerebbe patchare System.SysUtils per quello. Se passo nil o CFLocaleGetSystem, OSX usa anche l'ordinamento inglese. (prova a confrontare "ait" e "aIt" con il turco come lingua principale). Non appena viene utilizzato l'ordinamento olandese, io e io abbiamo lettere diverse. Quindi ovviamente non è un'opzione. –

Problemi correlati