Autor Téma: Unicode Uppercase / Lowercase na speciálních znacích  (Přečteno 389 krát)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Vážená komunito,

Mám vlastní zobrazovač souborů (FileListBox v Delphi je nedostačující) a filtrování mi dělá problém u názvů se speciálními znaky jako ú, ů, ü, ö atd... 

Kód: Delphi [Vybrat]
  1.   if FFileFilter <> '' then
  2.     if Pos(UpperCase(FFileFilter), UpperCase(sr.Name)) <> 1 then continue;
  3.  

Kód výše není moc vhodný kvůli rychlosti, ale pro příklad to stačí:
Když přes UpperCase proženu název Jürgen tak vrátí JüRGEN. Samozřejmě jsem schopný testovat jednotlivé znaky a toto porovnání si ošetřit, jen by mě zajímalo, proč se tak děje, když ü a Ü je stejné písmeno. To platí i pro jiné znaky, většinou s diakritikou. Jak u takovýchto znaků pak provádíte změnu na malé a velké?

Děkuji.
 

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1066
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Re:Unicode Uppercase / Lowercase na speciálních znacích
« Odpověď #1 kdy: 01-02-2021, 08:35:47 »
Já používám AnsiUpperCase

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Unicode Uppercase / Lowercase na speciálních znacích
« Odpověď #2 kdy: 01-02-2021, 08:53:01 »
Neměl by UpperCase fungovat i tak, když je vstupem WideString?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Unicode Uppercase / Lowercase na speciálních znacích
« Odpověď #3 kdy: 01-02-2021, 09:24:43 »
Když přes UpperCase proženu název Jürgen tak vrátí JüRGEN.
No protoze UpperCase je definovan jen pro ASCII tj. pro znaky a..z, kterym vynuluje b5, jinak nedela nic.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Unicode Uppercase / Lowercase na speciálních znacích
« Odpověď #4 kdy: 01-02-2021, 11:28:44 »
Excellent
Rated 1 time
Neměl by UpperCase fungovat i tak, když je vstupem WideString?
Nemel, tedy alespon ne bez parametru TLocaleOptions.

Tak misto archaickych funkci pouzivej string helper napr. FFileFilter.ToUpper()