Autor Téma: zobrazení českých znaků na listbox1  (Přečteno 1326 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
zobrazení českých znaků na listbox1
« kdy: 17-10-2018, 14:39:07 »
Můj program v současnosti načítá data ze souboru v kódování CP1250 a chtěl bych to změnit na načítáná dat z UTF-8. Data mám uložené v TListBox, načtené pomocí TStringList.LoadFromFile ... Není mi ale jasné co musím udělat, aby se zobrazily české znaky na listbox1? Všiml jsem si že v sadách není CENTRALEUROPE_CHARSET ale jen EASTEUROPE_CHARSET. Jakou sadu nastavit?

Delphi7, Windows XP

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3004
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:zobrazení českých znaků na listbox1
« Odpověď #1 kdy: 17-10-2018, 15:18:58 »
Zařekl jsem se, že už nechám D7 umřít, ale nedá mi to.

Když dáš listbox1.items.Add('ěščřžýá') tak češtinu uvidíš? Pokud ano,  tak blbě načítáš data, a jelikož nám neukážeš co ti to dělá (screenshot do přílohy) a na jakých datech (soubor do přílohy) a moje křišťálová koule je momentálně rozbitá, tak ti hold nelze pomoci.
Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:zobrazení českých znaků na listbox1
« Odpověď #2 kdy: 17-10-2018, 15:41:10 »
Dej mi chvliku než zjistím proč se mi nic nepřidalo do toho listboxu.
Testovací data v UTF8:

Kód: Delphi [Vybrat]
  1. harotcá        která chce
  2. išá harotcá  žena, která chce
Mezi těmi dvoumi jazyky je tabulator - ASCII 9

Načítání:
Kód: Delphi [Vybrat]
  1. var fileList: TStringList;
  2. begin
  3. fileList   := TStringList.create;
  4. fileList.LoadFromFile(filename);
  5. ...
  6. end;

EDIT:
Tak tohle se zobrazí normálně:
   listbox1.items.add('ěšřžčřý');
ale data načtené ze souboru prohlížená v kukátku vypadají takto:

TStringList Odpovedi:
'žena, která chce',
'která chce'

Z toho fileList vybírám odpovědi a přidávám je do TStringList Odpovedi.

« Poslední změna: 17-10-2018, 15:56:20 od vangog »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3004
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:zobrazení českých znaků na listbox1
« Odpověď #3 kdy: 17-10-2018, 15:51:33 »
vlož sem přímo soubor, tohle je informace k ničemu!
Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:zobrazení českých znaků na listbox1
« Odpověď #4 kdy: 17-10-2018, 15:57:26 »
tohle je výstup v tom listboxu

listbox1.font.charset := DEFAULT_CHARSET;
« Poslední změna: 17-10-2018, 16:03:36 od vangog »

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:zobrazení českých znaků na listbox1
« Odpověď #5 kdy: 17-10-2018, 16:00:23 »
zdrojový soubor

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3004
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:zobrazení českých znaků na listbox1
« Odpověď #6 kdy: 17-10-2018, 16:05:12 »
Excellent
Rated 1 time
tohle je výstup v tom listboxu

Uvidentne nacitas UTF8 soubor jako Ansi data, tj. pri nacteni neprovedeš konverzi z UTF8, což třeba unicode Delphi dělají u TStringListu.


Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:zobrazení českých znaků na listbox1
« Odpověď #7 kdy: 17-10-2018, 16:20:47 »
Díky, už jsem to vyřešil pomocí funkce
Kód: Delphi [Vybrat]
  1. UTF8Decode

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:zobrazení českých znaků na listbox1
« Odpověď #8 kdy: 17-10-2018, 18:21:16 »
Pokud do toho souboru uložím hebrejské znaky a použiju funkci utf8decode tak se mi vrátí jen otazníky. Jak toto vyřešit?

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 381
  • Karma: 0
    • Verze Delphi: 7
Re:zobrazení českých znaků na listbox1
« Odpověď #9 kdy: 17-10-2018, 18:56:24 »
Myslím ten výsledek funkce utf8decode. Tam jsou otázniky.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3004
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:zobrazení českých znaků na listbox1
« Odpověď #10 kdy: 17-10-2018, 22:03:56 »
Myslím ten výsledek funkce utf8decode. Tam jsou otázniky.

Vsak to Delfin napsal jasne. Delphi 7 neumí unicode (resp. to jde např. přes ty uvedené komponenty). Novější Delphi jsou s podporou unicode.
Embarcadero MVP - Czech republic

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 315
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:zobrazení českých znaků na listbox1
« Odpověď #11 kdy: 18-10-2018, 08:55:14 »
I v ne-Unicode Delphi se dá pracovat s Unicode, jen to není tak pohodlné. Výstup z Utf8Decode() ulož do proměnné typu WideString a tu pak předhoď následující funkci a dostaneš kýžený AnsiString.

Kód: Delphi [Vybrat]
  1. function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
  2. var
  3.   l: Integer;
  4. begin
  5.   if ws = '' then
  6.     Result := ''
  7.   else
  8.   begin
  9.     l := WideCharToMultiByte(codePage,
  10.       WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
  11.       @ws[1], - 1, nil, 0, nil, nil);
  12.     SetLength(Result, l - 1);
  13.     if l > 1 then
  14.       WideCharToMultiByte(codePage,
  15.         WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
  16.         @ws[1], - 1, @Result[1], l - 1, nil, nil);
  17.   end;
  18. end;
  19.  
nil