Odesφlßnφ mail∙ s diakritikou

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: base64
nebo
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.

© Ji°φ Kosek 1999