Kurz5 - Kapitola9

17. června 2007 v 11:06 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

7.9 Kódování a znakové sady

Podrobný rozbor formátu zprávy a způsobu kódování by překročil zamýšlený rámec celého kurzu. Budete-li mít zájem hlouběji se do problematiky ponořit, můžete začít hledat na Internetu standardy RFC. Připravte se na to, že budete muset pročíst několik desítek (až stovek) stran anglického textu :-(. Pro formát zprávy jsou nejdůležitější dokumenty RFC 822 a RFC 2822. Víceúčelové rozšíření je pak popsáno v RFC 2045 až 2049.
To, co zde bude následovat, je jen lehký "výcuc"...
Zpráva, která vás čeká v E-mailové schránce na přečtení, se skládá ze dvou částí. První z nich je tzv. hlavička. V ní je na samostatných řádcích uvedeno:
  • adresát
  • odesílatel
  • adresa na kterou se odpovídá
  • předmět zprávy
  • kódování zprávy
  • a řada dalších pomocných informací.
Některé položky mohou chybět, jiné mohou být přísně specifické pro určité poštovní programy apod. Výhodou použité třídy CPop3Message je, že nejdůležitější informace dokáže z hlavičky extrahovat a dodat pomocí metod jako jsou GetFrom(), GetSubject() atd.
Druhou částí zprávy je její vlastní tělo. Pro náš jednoduchý program, který zjistí, kdo píše a předmět zprávy, je tělo celkem nezajímavé a nebudeme se jím zabývat.
V dřívějších dobách byl jeden řádek hlavičky zprávy čitelný a vypadal asi takto:
Subject: Pozdrav z Prahy
E-mailové servery vyžadovaly, aby znaky ve zprávě byly pouze v rozsahu standardní ASCII tabulky pro anglické texty. Používání jiných jazyků, si vynutilo různá rozšíření ASCII tak, aby bylo možné zobrazovat všechny ty háčky, čárky, vokáně, umlaufy a kdoví co ještě.
Aby se dodržel požadavek starších serverů na 7bitové znaky ASCII (i když novější již prý zvládají i 8bitové znaky), začal se text kódovat. Takže nyní byste v české hlavičce objevili pravděpodobně toto:
Subject: =?iso-8859-2?Q?Objedn=E1vka?=
Řádek je rozdělen na několik částí. V první z nich je uvedena použitá znaková sada pro řádek uzavřená mezi otazníky. Druhá část uvádí způsob kódování (opět ohraničeno otazníky). Dvě nejčastější, která náš program zpracovává jsou:
  • QUOTED-PRINTABLE - poznáte podle ?Q? na řádku. Je relativně jednoduché. Zjednodušeně řečeno - znaky, které nejsou ASCII nebo nejsou čitelné, jsou nahrazeny znakem "je rovno" a hexadecimální reprezentací znaku. Např. text "Káva" je nahrazen "K=E1va".
  • BASE64 - poznáte podle ?B? na řádku. Takto zakódovaný text už moc čitelný není. Algoritmus bere vždy tři 8bitové znaky, které položí vedle sebe jako 24 bitů. Pak je rozdělí na 4 šestice za sebou, pro jejichž reprezentaci použije sadu čitelných ASCII znaků ze speciální tabulky. Text "Password:" je zakódován do "UGFzc3dvcmQ6"
Třetí část mezi posledními otazníky je vlastní zakódovaný text.
Pokud se nám podaří zakódovaný text z řádku dostat, nemusíme ještě mít vyhráno. Písmena s háčky a čárkami se nemusí zobrazit správně. Z historických důvodů se používá několik znakových sad pro ukládání českého textu.
Pro Windows mají především význam tyto tři znakové sady:
  1. ISO8859-2: Norma ISO pro východoevropské jazyky. Každý znak je uložen v 1 bajtu. Spodní část tabulky je shodná s ASCII. V současnosti používá tuto znakovou sadu pro odesílání řada E-mailových klientů.
  2. Windows 1250: Je téměř shodné s ISO8859-2. Microsoft však z neznámých (pravděpodobně ekonomických) důvodů přehodil několik znaků. Čeština se liší na pozici š,ť a ž.
  3. Unicode: Univerzální znaková sada pro všechny jazyky světa. Každý znak je uložen ve 2 bajtech. Windows CE interně používají právě tuto znakovou sadu. Někdy se texty v Unicode ukládají a posílají v tzv. UTF-8 kódování. V něm se znaky z ASCII rozsahu do 127 ukládají v 1 bajtu, všechny ostatní mají 2 a více bajtů s hodnotou větší než 127.
Abyste byli trochu v obraze, uvádím zde tabulku reprezentace českých znaků v různých znakových sadách.
ZnakISO8859-2Windows 1250UnicodeUTF-8
Á0xC10xC10xC10xC3,0x81
á0xE10xE10xE10xC3,0xA1
É0xC90xC90xC90xC3,0x89
é0xE90xE90xE90xC3,0xA9
Ě0xCC0xCC0x11A0xC4,0x9A
ě0xEC0xEC0x11B0xC4,0x9B
Í0xCD0xCD0xCD0xC3,0x8D
í0xED0xED0xED0xC3,0xAD
Ó0xD30xD30xD30xC3,0x93
ó0xF30xF30xF30xC3,0xB3
Ú0xDA0xDA0xDA0xC3,0x9A
ú0xFA0xFA0xFA0xC3,0xBA
Ů0xD90xD90x16E0xC5,0xAE
ů0xF90xF90x16F0xC5,0xAF
Ý0xDD0xDD0xDD0xC3,0x9D
ý0xFD0xFD0xFD0xC3,0xBD
Č0xC80xC80x10C0xC4,0x8C
č0xE80xE80x10D0xC4,0x8D
Ď0xCF0xCF0x10E0xC4,0x8E
ď0xEF0xEF0x10F0xC4,0x8F
Ň0xD20xD20x1470xC5,0x87
ň0xF20xF20x1480xC5,0x88
Ř0xD80xD80x1580xC5,0x98
ř0xF80xF80x1590xC5,0x99
Š0xA90x8A0x1600xC5,0xA0
š0xB90x9A0x1610xC5,0xA1
Ť0xAB0x8D0x1640xC5,0xA4
ť0xBB0x9D0x1650xC5,0xA5
Ž0xAE0x8E0x17D0xC5,0xBD
ž0xBE0x9E0x17E0xC5,0xBE
Po tomto úvodu začínám mít dojem, že funkce QPB64Decoder bude snad pochopitelná. Nejprve se snažíme zjistit, zda je použito kódování "Quoted-printable" nebo "Base64". Pak najdeme a metodou Mid třídy CString vyjmeme zakódovaný text. Pro "Quoted-printable" jsem si dekodér napsal sám. "Base64" je trochu složitější, proto jsem použil hotovou třídu. Další způsoby kódování opomíjím.
Jelikož předpokládám, že použitá znaková stránka je ISO8859-2 nebo Windows 1250, převedu české znaky do Unicode používané ve Windows CE. Obě znakové sady jsou téměř shodné a odlišné znaky se nepřekrývají. Nemusím tedy zjišťovat, o jakou sadu jde. Jiné znakové stránky opět opomíjím. Budete-li mít zájem, můžete si je nastudovat a upravit za domácí úlohu.
Pro tento jednoduchý program jsem záměrně vynechal další kódování a znakové sady. Všechno ostatní tedy vracím k zobrazení v původní podobě.
Druhá funkce je určena pro výběr kontrolu adresy odesílatele a je velmi jednoduchá. Za adresu je prohlášeno to, co je uzavřené mezi "<>" a obsahuje "@".
V profesionálním programu bychom museli asi pečlivěji a lépe rozebrat další možnosti, ale pro náš cvičný účel by to mohlo stačit.
Teď si uvědomuji, že jsem trochu zapomněl na slovenské znaky. Řada čtenářů je ze Slovenska, omlouvám se jim za diskriminaci. Aby zdrojový kód programu a text tabulky nebyly zbytečně dlouhé, už to nechám tak. Doplnění nebo úprava pro slovenské znaky bude velmi jednoduché, tabulky najdete např. na těchto stránkách. Ještě jednou - ospravedlňujem sa... :-)

Co bychom si měli z této lekce zapamatovat?

  • Češtinu je možné ukládat v různých znakových sadách.
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.