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