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.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes;

var
  enc: TEncoding;
  by: TBytes;
  target: TBytes;
  fw: TBinaryWriter;
  sw: TStreamWriter;
  sl: TStringList;

const
  s = 'Příliš žluťoučký kůň úpěl dábelské ódy.';
begin
//  enc := TEncoding.ASCII; // cílové kodování
//  enc := TEncoding.UTF8; // v tomto pripade lepe UTF8Encode('')
//  enc := TEncoding.GetEncoding(852);
  enc := TEncoding.GetEncoding('ISO-8859-2');

  by := TEncoding.Unicode.GetBytes(s);
  target := TEncoding.Convert(TEncoding.Unicode, enc, by);

  fw:= TBinaryWriter.Create('data.txt');
  fw.Write(target);
  fw.Close;

  sw:= TStreamWriter.Create('data2.txt', False,  enc);
  sw.Write(s);
  sw.Close;

  sl := TStringList.Create;
  sl.Text := s;
  sl.SaveToFile('data3.txt', enc);  // + CRLF
  sl.Free;

end.

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ý.

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

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).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

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.

Poslední komentáře

Comment RSS

Dle měsíců