Autor Téma: RichEdit omezení při UFT8  (Přečteno 165 krát)

Offline szs

  • Nováček
  • *
  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: XE2
RichEdit omezení při UFT8
« kdy: 04-08-2019, 12:57:21 »
Ahoj,

 pokud načtu ANSI soubor do TrichEdit pomocí

 
Kód: Delphi [Vybrat]
  1.  richedit1.lines.LoadFromFile(soubcopy[x]);

 vše je ok. Pokud ho v notepadu přeuložím na UTF-8 a načtu pomocí stejného příkazu, nebo pomocí

Kód: Delphi [Vybrat]
  1.   richedit1.lines.LoadFromFile(soubcopy[x], TEncoding.UTF8);

 hodí mi to chybu:

 ...exception class EEncodingError with message 'No mapping for the Unicode character exists in the target multi-byte code page.'


 Děje se to jen u souborů nad cca 50 Kb, menší fungují. Soubory neobsahují žádný speciální znak, přidávám ho pro jistotu do přílohy.

 Testováno v Delphi XE 8.


Nenapadá vás důvod?

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 737
  • Karma: 42
    • Verze Delphi: 10.3
Re:RichEdit omezení při UFT8
« Odpověď #1 kdy: 04-08-2019, 17:50:12 »
V Delphi 10.3.2 se z něj načte prvních 4089 bajtů, pak to hodí tu chybu. Když ale neobsahuje BOM (ty první 3 bajty), načte se bez problémů celý - přikládám.

Offline szs

  • Nováček
  • *
  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: XE2
Re:RichEdit omezení při UFT8
« Odpověď #2 kdy: 04-08-2019, 22:25:52 »
Děkuju za otestování!

Je to nějaký bug? Nikde jsem to ale nevygooglil :( Zkoušel jsem i RichEdit1.MaxLength:=$7FFFFFF0;  Plaintext mám true.

Podařilo se mi to obejít pomocí

 
Kód: Delphi [Vybrat]
  1.   MyList := TStringList.Create;
  2.   MyList.LoadFromFile(nazev);            
  3.   richedit1.Lines.Assign(MyList);
  4.   MyList.Destroy;

ale u 350 kB souboru trvá načtení asi 2 minuty :(

Nebo je nějaká dobrá free alternativa k richeditu, vhodná čistě pro zobrazení textu?

Díky!!
« Poslední změna: 04-08-2019, 22:28:16 od szs »

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 737
  • Karma: 42
    • Verze Delphi: 10.3
Re:RichEdit omezení při UFT8
« Odpověď #3 kdy: 04-08-2019, 22:35:14 »
To by asi bylo lepší načíst do tMemoryStream bez těch prvních 3 bajtů a pak RichEdit1.Lines.LoadFromStream.
No a nestačí teda tMemo, když stejně máš plain text?

Offline szs

  • Nováček
  • *
  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: XE2
Re:RichEdit omezení při UFT8
« Odpověď #4 kdy: 04-08-2019, 23:13:54 »
Potřebuji, aby to šlo napříč kódováním (ANSI, UTF8, UTF16,..). Když to načtu jako StringList, postará se to o správné kódování. U MemoryStreamu bych to předpokládám musel určovat manuálně podle toho BOMu. Asi to ale zkusím, tohle je fakt hrozně na dlouho.

Díky za tip!

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 737
  • Karma: 42
    • Verze Delphi: 10.3
Re:RichEdit omezení při UFT8
« Odpověď #5 kdy: 04-08-2019, 23:15:22 »
tMemoryStream by byl jen "mezisklad". Zkusil bych nejdřív to tMemo.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2579
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:RichEdit omezení při UFT8
« Odpověď #6 kdy: 05-08-2019, 06:26:09 »
To by asi bylo lepší načíst do tMemoryStream bez těch prvních 3 bajtů a pak RichEdit1.Lines.LoadFromStream.
To prece muzes udelat rovnou s TFileStream, kde muzes checknout zacatek souboru na BOM a pak ev. seekem preskocit a nacist pomoci LoadFromStream

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 737
  • Karma: 42
    • Verze Delphi: 10.3
Re:RichEdit omezení při UFT8
« Odpověď #7 kdy: 05-08-2019, 07:44:20 »
To prece muzes udelat rovnou s TFileStream, kde muzes checknout zacatek souboru na BOM a pak ev. seekem preskocit a nacist pomoci LoadFromStream

Máš pravdu, nevím, proč jsem to tak překombinoval.