Forum Delphi.cz

Delphi => Obecné => Téma založeno: Jirka 05-10-2021, 15:48:31

Název: Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Jirka 05-10-2021, 15:48:31
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.
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: geby 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).
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Jan Fiala 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
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Jirka 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 ..

Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: geby 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.  
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Jirka 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.
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Jan Fiala 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.
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Radek Červinka 10-10-2021, 19:44:12
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.
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: pf1957 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.  
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Jan Fiala 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.
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: geby 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 ?
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Jan Fiala 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.
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: vandrovnik 14-10-2021, 12:43:36
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 (https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SetCodePage)
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: Jan Fiala 14-10-2021, 21:12:26
To mění jen předaný RawByteString, ne?
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SetCodePage (https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SetCodePage)

Pravdu máš. Už asi fakt potřebuju na nějakou dobu vypnout.
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: < z > 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
Název: Re:Odstranění diakritiky u  (velké A se stříškou)
Přispěvatel: geby 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.