Autor Téma: Odstranění diakritiky u  (velké A se stříškou)  (Přečteno 881 krát)

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Nevím zda je to vlastnost nebo chyba, ale pomocí funkce 
Kód: Delphi [Vybrat]
  1. SynaChar.CharsetConversionEx(AnsiString(MujText), CP1250, CP1250, replace_czech)])

se mi to nedaří převést.
« Poslední změna: 05-10-2021, 15:53:31 od Jirka »

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 241
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #1 kdy: 05-10-2021, 22:09:56 »
Tabulka "replace_czech", jak název napovídá, nahrazuje česká písmenka. Stříšky tam nejsou.

V dnešní době unicode Delphi bych ale šel spíš cestou přiřazení do stringu s kódovou stránkou 20127 (US-ASCII).

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 234
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #2 kdy: 06-10-2021, 06:58:27 »
Na odstranění diakritiky používám:

Kód: Delphi [Vybrat]
  1. function StringToEncoding(const AInput: string; AEncoding: Integer): string;
  2. var
  3.   enc: TEncoding;
  4.   by: TBytes;
  5. begin
  6.   enc := TEncoding.GetEncoding(AEncoding);
  7.   try
  8.     by := TEncoding.Unicode.GetBytes(AInput);
  9.     by := TEncoding.Convert(TEncoding.Unicode, enc, by);
  10.     Result := enc.GetString(by);
  11.   finally
  12.     enc.Free;
  13.   end;
  14. end;
  15.  

AEncoding je v tomto případě stránka 20127, což je US ASCII 7b
Funguje to obecně, nejen pro CZ

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #3 kdy: 06-10-2021, 09:02:26 »
Tabulka "replace_czech", jak název napovídá, nahrazuje česká písmenka. Stříšky tam nejsou.

Díky za info , snad mě částečně omlouvá to, že jsem více  moravák než  čech :D


Na odstranění diakritiky používám:
function StringToEncoding(const AInput: string; AEncoding: Integer): string;

Díky , už jsem to začal používat ..


Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 241
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #4 kdy: 08-10-2021, 20:32:51 »
Já měl na mysli trochu jednodušší řešení. (v podstatě to ani nemusí být funkce...)

Kód: Delphi [Vybrat]
  1. function StrToAscii(const value: string): string;
  2. type
  3.   AsciiString = type AnsiString(20127);
  4. begin
  5.   Result := string(AsciiString(value));
  6. end;
  7.  

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 431
  • Karma: 9
    • Verze Delphi: XE2
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #5 kdy: 10-10-2021, 12:14:38 »
Já měl na mysli trochu jednodušší řešení. (v podstatě to ani nemusí být funkce...)

Já jsem zvolil Honzovo řešení víceméně z toho důvodu,  že nedochází ještě k mezi-převodu na AnsiString.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 234
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #6 kdy: 10-10-2021, 14:44:06 »
AnsiString je od urcite verze Delphi definovany jako UNICODE string.
A verim tomu, ze ta implementace, kdy nastavis pro UNICODESTRING kodovou stranku a pak tam priradis string bude hodne podobna, jen ten zapis je kratsi.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2972
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #7 kdy: 10-10-2021, 19:44:12 »
Excellent
Rated 1 time
AnsiString je od urcite verze Delphi definovany jako UNICODE string.

To jednoduse není pravda. AnsiString je uplne jiny typ. Proto treb WinApi ma i API xxA a xxW , kde prvni je ansi varianta.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #8 kdy: 10-10-2021, 23:07:15 »
To jednoduse není pravda. AnsiString je uplne jiny typ. Proto treb WinApi ma i API xxA a xxW , kde prvni je ansi varianta.
Ano, ANSIString je posloupnost bytu -> sice muze obsahovat MBCS nebo UTF8 kodovani, ale typicky je to single byte string spojeny s nejakou kodovou strankou v kodovani ANSI, takze konverze Unicode -> ANSI muze ztracet data.  Proto jsme treba pouzivali kontrolu:
Kód: Delphi [Vybrat]
  1. Assert(StrCanConvertToAnsi(s),'Unicode content of TStringList cannot be converted to ANSI using default Code Page');
  2.  

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 234
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #9 kdy: 11-10-2021, 07:20:36 »
To jednoduse není pravda. AnsiString je uplne jiny typ. Proto treb WinApi ma i API xxA a xxW , kde prvni je ansi varianta.

Máš pravdu. Nějak jsem to měl v hlavě zafixované z webu, kde to takto bylo uvedeno.

A už vím, proč jsem to dělal přes funkci, kterou jsem uváděl výš. Řešení od Lukáše neumožňuje poslat jako parametr kódovou stránku, a já to mám jako obecnou funkci na překódovoání řetězce.
« Poslední změna: 11-10-2021, 07:26:19 od Jan Fiala »

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 241
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #10 kdy: 12-10-2021, 22:22:15 »
Tak jsme ve vlakne o odstraneni diakritiky, ne o prevodu na libovolnou kodovou stranku. Proto jsem to tu zminil. Mimochodem, vis o funkci System.SetCodePage ?

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 234
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #11 kdy: 14-10-2021, 12:35:49 »
Tak jsme ve vlakne o odstraneni diakritiky, ne o prevodu na libovolnou kodovou stranku. Proto jsem to tu zminil. Mimochodem, vis o funkci System.SetCodePage ?

Jen to tím měníš pro celou aplikaci. Je to podobné jako nastavení formátu. A když to nevrátíš, může být problém.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1258
  • Karma: 51
    • Verze Delphi: 10.3
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #12 kdy: 14-10-2021, 12:43:36 »
Excellent
Rated 1 time
Tak jsme ve vlakne o odstraneni diakritiky, ne o prevodu na libovolnou kodovou stranku. Proto jsem to tu zminil. Mimochodem, vis o funkci System.SetCodePage ?

Jen to tím měníš pro celou aplikaci. Je to podobné jako nastavení formátu. A když to nevrátíš, může být problém.

To mění jen předaný RawByteString, ne?
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SetCodePage

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 234
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #13 kdy: 14-10-2021, 21:12:26 »
To mění jen předaný RawByteString, ne?
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SetCodePage

Pravdu máš. Už asi fakt potřebuju na nějakou dobu vypnout.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1169
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #14 kdy: 15-10-2021, 19:13:20 »
Pokud chceš nejdelší řešení, tak ve Windows je funkce NormalizeString
(ale už ti neřeknu, jaký je rozdíl ve výsledku proti zde uvedné funkci)
https://stackoverflow.com/questions/66733768/any-rtl-function-to-remove-accents-from-a-char/66745184

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 241
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Odstranění diakritiky u  (velké A se stříškou)
« Odpověď #15 kdy: 16-10-2021, 07:23:26 »
Výhoda je v tom, že odstraníš jen diakritiku, ale ostatní unicode znaky ti zůstanou. Takže nejsi omezen jen na ASCII.