Jiří Kosek ml.
Ze svých skriptů bych rád odesílal maily i s českými znaky s diakritikou. Když však funkci pro odesílání mailů předám český text, jsou české znaky při čtení mailu v poštovním programu zkomolené.
Ač by si člověk rád myslel, že na konci 20. století nebude pro počítač problém nakládat s českými znaky, opak je pravdou. Příčinou všech problémů je však člověk sám. Původně počítače podporovaly pouze znaky anglické abecedy. Pro úsporu místa se používalo pouze 7bitové kódování, a na více znaků proto ani nezbýval prostor. Později s nástupem výkonějších počítačů a levnějších pamětí se začalo používat kódování 8bitové. Ve druhé půlce kódové tabulky pak byl prostor pro umístění českých znaků s diakritikou. Bohužel vzniklo několik navzájem nekompatibilních způsobů, jak rozmístit české znaky do kódové tabulky. V DOSu si oblibu získalo kódování bratrů Kamenických, které využívalo podobnost některých semigrafických znaků s českými znaky. Český text tak šlo číst i na starších grafických adaptérech a tiskárnách, které neuměly předefinovat znakovou sadu. Microsoft však ve svých novějších verzích MS DOSu přišel s vlastním kódováním CP 852. S nástupem Windows představil pro češtinu Microsoft další vlastní kódování -- CP 1250. To bylo (podle některých pamětníků záměrně) drobně pozměněno, aby se lišilo od v té době již existujícího standardního kódování ISO 8859-2 (ISO Latin 2). ISO 8859-2 je kódování přijaté jako standard mezinárodní standardizační organizací ISO. Svého času se ještě používalo kódování KOI8-CS, které má kořeny v RVHP. Vlastní kódování češtiny mají i počítače Macintosh. Situace zkrátka není jednoduchá.
Při odesílání českých mailů stojíme přede dvěma problémy. Prvním
problémem je, že tělo mailu by mělo obsahovat pouze znaky s kódem
0 až 127 (tj. 7bitové kódování). České znaky jsou ve všech kódováních
reprezentovány znaky s kódem větším než 127. Druhý problém je
použití vhodného kódování. Dvě nejpoužívanější kódování jsou
windows-1250
(to se používá ve Windows) a
iso-8859-2
(standardní kódování, používáno zejména na
unixu).
Oba problémy můžeme vyřešit použitím tzv. MIME. MIME je široce
podporované rozšíření formátu elektronických dopisů, které umožňuje
přenášení různých druhů dat (text, obrázky, zvuk, binární data). Pokud
potřebujeme v těle dopisu přenášet 8bitová data (tedy i český
text s diakritikou), musíme ho překódovat jednou ze dvou metod
base64 nebo quoted-printable. První z nich převádí trojici
8bitových znaků na čtveřici 7bitových. Quoted-printable převádí znaky
s kódem větším než 127 na sekvenci =xx
, kde
xx
je kód znaku zapsaný v šestnáctkové soustavě.
Pokud tělo dopisu zakódujeme jednou z těchto metod, musíme přidat k dopisu hlavičku:
Content-Transfer-Encoding: base64nebo
Content-Transfer-Encoding: quoted-printable
Protože používáme rozšíření MIME, musí se mezi hlavičkami objevit i definice použité verze MIME:
MIME-Version: 1.0
Jako kódování češtiny bychom měli používat pouze
iso-8859-2
. Text dopisu tedy musíme do tohoto kódování
převést. Většina tvůrců webových stránek však pracuje ve Windows,
a proto i stránky a skripty píše v kódování Windows. Obě
kódování se liší jen nepatrně. V PHP pro převod textu mezi
kódováními můžeme s výhodou použít funkci
StrTR()
. Pokud máme text dopisu převeden do správného
kódování, musíme ještě přidat hlavičku, která určuje použité kódování
pro tělo dopisu.
Content-Type: text/plain; charset="iso-8859-2"
Nyní již známe vše potřebné, pro vytvoření správného mailu i
s českým textem. Poznamenejme ještě, že v PHP máme
k dispozici funkce Base64_Encode()
a
IMAP_8Bit()
, které překódují text metodou base64 nebo
quoted-printable. Nyní nestojí nic v cestě definování funkce
CZMail()
, která se bude chovat stejně jako
Mail()
, ale umožní odesílání mailů s českými texty.
<? function CZMail($to, $subj, $text, $headers = "") { // převedení z windows-1250 do iso-8859-2 (pokud je potřeba) $text = StrTr($text, "\x8A\x8D\x8E\x9A\x9D\x9E", "\xA9\xAB\xAE\xB9\xBB\xBE"); // překódování do Base64 $text = Base64_Encode($text); // přidání hlaviček $headers .= "MIME-Version: 1.0\n". "Content-Type: text/plain; charset=\"iso-8859-2\"\n". "Content-Transfer-Encoding: base64\n"; // odeslání e-mailu Mail($to, $subj, $text, $headers); } ?>
Nyní můžeme bez problémů odesílat i maily s diakritikou:
CZMail("nekdo@nekde.cz", "Dopis", "Už můžu psát dopisy česky!!!");
Pokud vás problematika češtiny a počítačů zaujala, podívejte se na adresu www.cestina.cz.