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
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
21
22
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);
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ý.