Kódujeme, kódujete - TEncoding

vložil Radek Červinka 25. března 2011 00:09

Do doby než nás spasilo unicode kodování snad každý programátor potřeboval převádět mezi různými codepage. No ono je to někdy třeba i dnes. Většinou se u nás používala Synapse, ale s příchodem Delphi 2010 byla (konečně) RTL Delphi výrazně (a to dost šikovně) rozšířena o podporu převodu mezi různými kódováními.

Základem je třída SysUtils.TEncoding (a 30K tabulek, o které se zvětšila velikost EXE). Tato třída definuje některé standardní kódování (Unicode, UTF8, UTF7, ASCII …) a pro použití jiných definuje rozhraní. Třída je velmi podobná podobné třídě v .NET.

V následujícím příkladu ukáži základní použití a také, jak se to dá použít jinde.

    1program Project1;
    2
    3{$APPTYPE CONSOLE}
    4
    5uses
    6  SysUtils,
    7  Classes;
    8
    9var
   10  enc: TEncoding;
   11  by: TBytes;
   12  target: TBytes;
   13  fw: TBinaryWriter;
   14  sw: TStreamWriter;
   15  sl: TStringList;
   16
   17const
   18  s = 'Příliš žluťoučký kůň úpěl dábelské ódy.';
   19begin
   20//  enc := TEncoding.ASCII; // cílové kodování
   21//  enc := TEncoding.UTF8; // v tomto pripade lepe UTF8Encode('')
   22//  enc := TEncoding.GetEncoding(852);
   23  enc := TEncoding.GetEncoding('ISO-8859-2');
   24
   25  by := TEncoding.Unicode.GetBytes(s);
   26  target := TEncoding.Convert(TEncoding.Unicode, enc, by);
   27
   28  fw:= TBinaryWriter.Create('data.txt');
   29  fw.Write(target);
   30  fw.Close;
   31
   32  sw:= TStreamWriter.Create('data2.txt', False,  enc);
   33  sw.Write(s);
   34  sw.Close;
   35
   36  sl := TStringList.Create;
   37  sl.Text := s;
   38  sl.SaveToFile('data3.txt', enc);  // + CRLF
   39  sl.Free;
   40
   41end.

Kromě klasické věty, ve které mají být obsaženy všechny naše speciální znaky, jsou na řádcích 20 - 23 pár ukázek jak získat konkrétní kódování. Upozorňuji, že TEncoding je univerzální třída. Kromě ní existuje v RTL několik speciálních funkcí např. pro práci s UTF8 atd.

Na řádku 25 získáme byte reprezentaci naší věty (Unicode je ekvivalent základního string) a na řádku 26 provedeme konverzi (zdrojové kódování, cílové kódování a data). Takže nyní máme převedená data.

TBinaryWriter je velmi šikovná třída (už jsem ji tu popisoval - moc se mi líbí) a použijeme ji.

Existuje i jednoduší varianta - TStreamWriter obsahuje přímou podporu pro ukládání v konkrétní kódové stránce (TStreamWriter zase pro načítání). I další třídy mají podobná rozšíření. Např. TStringList - viz. poslední blok.

Nyní jsou v Delphi tyto třídy: Classes.TBinaryWriter (binární data), Classes.TStreamWriter (znaky), Classes.TStringWriter (string), Classes.TTextWriter (jejich předchůdce), Classes.TWriter (klasická třída pro zápis objektů).

A podobně pro TxxxxReader.

Jen pro úplnost: Rozhraní TEncoding je samozřejmě větší, ale princip je snad jasný.


Nabízíme Delphi školení a konzultace na různá témata, primárně ve Vaší firmě.

Tagy: , , ,

Novinky v Delphi

Komentáře

28.3.2011 18:06:55 #

Radim

Diky, konecne mam v tych prevodoch kodovani jasno.

Radim

18.8.2012 0:40:27 #

Zdeněk Krejčí

No myslím že co se týče kodování/převodu snad by stačilo Result:= TEncoding.GetEncoding(0).GetString(Bytes);

Zdeněk Krejčí

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS