Signokodoj

Signorepertuaro, signokodo, kodprezento... ???!

Ĉi tiu teksto esence estas adapto de Anglalingva dokumento (“A tutorial on character code issues”), kiun verkis kaj enretigis Jukka KORPELA. Mia versio naskiĝis kiel simpla traduko de (antaŭa versio de) lia dokumento, sed finfine mi tiom rearanĝis, resumis kaj adaptis lian prezenton, ke oni ne povas plu paroli pri nura traduko. Tamen, la esencaj instruoj kaj ideoj (kaj ankoraŭ multaj vortumoj) estas ankoraŭ de Jukka KORPELA, kaj li havu plenan rekonon por sia laboro.

Kelkaj difinoj

Iuj el la sekvaj difinoj ne estas universale akceptitaj. Efektive unu el la plej grandaj kaŭzoj de konfuzo pri signokodaj aferoj estas varia kaj malorda terminologio.

“bitoko”

= grupo de ok bitoj. En komputiloj datumoj estas prezentataj interne kiel bitokoj. Bitoko estas malgranda datuma unuo kun numera valoro inter 0 kaj 255. Bitoko konsistas el ok bitoj (pro tio la nomo bitoko), sed ĉi tie ne necesas paroli pri bitoj. (Bitoko estas ankaŭ nomata bajto.)

Bitokoj estos ĉi-poste prezentataj precipe per la normala (dekuma) notacio, sed notu, ke ankaŭ aliaj prezentomanieroj uzeblas, precipe notacioj okuma kaj deksesuma.

“signorepertuaro”

= aro de apartaj signoj. Signorepertuaro tute ne supozas ian certan komputilan reprezentadon. Rimarku, ke signorepertuaro povas enhavi signojn, kiuj povas aspekti same, sed kiuj estas rigardataj kiel logike apartaj, kiel ekz. Latina majuskla A, Cirila majuskla A, kaj Greka majuskla alfa.

“signokodo”

= sistemo, en kiu ĉiu signo de signorepertuaro estas ligita al numero, kiu reprezentu tiun signon. Ĉiu signo ricevas unikan numeran kodon (kodan pozicion, kodan valoron). La numeroj de signokodo ne necese konsistas el intersekvaj numeroj. Fakte plej multaj signokodoj enhavas “truojn”, kiel ekz. kodpoziciojn rezervitajn por stiraj funkcioj aŭ por eventuala estonta uzo.

“kodprezento”

= metodo por prezenti signojn en cifereca formo. Kodprezento difinas, kiuj sinsekvoj de bitokoj reprezentu kiujn numerojn de signokodo. En la plej simpla okazo ĉiu signo de signokodo havas numeron inter 0 kaj 255, kaj oni prezentas ĉiun signon per unu bitoko, kiu havas ĝuste tiun saman valoron: signo numero 60 estas reprezentata de bitoko kun la valoro 60, k.t.p. Kompreneble tiel simplega kodprezento eblas nur por signorepertuaroj kun maksimume 256 signoj. Por pli grandaj repertuaroj pli malsimplaj kodprezentoj necesas.

Alivorte

  • Signorepertuaro estas kolekto de signoj, kiel a, !, kaj ä.
  • Signokodo difinas numerajn kodojn por ĉiuj signoj de repertuaro. Ekz., en la signokodo ISO 10646 la numeraj kodoj por a, !, ä, kaj (promila signo, “o/oo”) estas 97, 33, 228, kaj 8240 respektive.
  • Kodprezento difinas, kiamaniere sinsekvoj de numeraj kodoj estas prezentataj kiel sinsekvoj de bitokoj. En unu ebla kodprezento de la signokodo ISO 10646 la ĉeno a!ä‰ estas prezentata kiel la jena sinsekvo de bitokoj: 0, 97, 0, 33, 0, 228, 32, 48 (po du bitokoj por ĉiu signo).

La esprimo signaro estas uzata kun diversaj signifoj. Ofte ĝi indikas nur signorepertuaron, sed ĝi ankaŭ povas havi la signifon signokodo aŭ eĉ kodprezento. Kiam estiĝas malklaraĵoj, estas bone provi difini, kian precizan sencon oni celas per la vorto signaro.

Askio

Askio (ASCII) estas malnova signa repertuaro, kodo, kaj kodprezento. Kiel internacia normo ĝi estas nomata ISO 646.

La Askia signokodo donas numerojn al preseblaj signoj komencante per 32 (por spaceto) kaj finante per 126 (por la tildo-signo ~). Krome Askio enhavas ankaŭ aron de stirsignoj (nepreseblaj signoj), ekz. liniavanco (LF).

La preseblaj signoj de Askio, estas prezentataj en la jena Tabelo de Askio.

La Askia kodprezento estas plejeble simpla: ĉiu kodonumero estas prezentata per bitoko kun la sama valoro. Rimarku, ke la kodonumeroj de 0 ĝis 31, kaj 127, ne respondas al preseblaj signoj. Ili estas rezervitaj por stirado.

La numeroj/bitokoj 128 - 255 ne estas uzataj en Askio.

Foje oni parolas pri okbita Askio. Tio estas misnomo por diversaj signokodoj, kiuj estas vastigoj de Askio. Iliaj signorepertuaroj enhavas Askion kiel subaron, sed la kodonumeroj estas inter 0 kaj 255. Ne malofte oni eĉ uzas la simplan nomon Askio por tiaj signokodoj. Precipe Latino 1 estas ofte misnomata Askio. Sciu, ke vera Askio tute ne enhavas ion kun numero super 127.

ISO Latino 1

La normo ISO 8859-1 difinas signorepertuaron kun la nomo Latina alfabeto n-ro 1, kutime ISO Latino 1 aŭ simple Latino 1. ISO 8859-1 ankaŭ difinas signokodon por tiu repertuaro. La repertuaro enhavas la Askian repertuaron kiel subaron (kun la samaj signonumeroj kiel en Askio). La normo ankaŭ difinas kodprezenton, kiu estas same simpla kiel tiu de Askio: ĉiu kodonumero estas prezentata simple kiel unu bitoko.

Aldone al la Askiaj signoj, ISO Latino 1 enhavas diversajn supersignajn kaj aliajn literojn bezonatajn por skribi lingvojn de okcidenta Eŭropo, kaj krome ankaŭ kelkajn aliajn specialajn signojn. Tiuj aldonaj literoj kaj signoj okupas la kodajn poziciojn 160 - 255.

Jen tabelo de Latino 1 (krom tiu parto, kiu identas kun Askio).

ISO Latino 3

Apud ISO Latino 1 oni starigis aliajn signorepertuarojn kaj kodojn, kiuj estas variantoj de Latino 1, sed kiuj estas adaptitaj al aliaj lingvogrupoj. Ili nomiĝas ISO 8859-2 (Latino 2), ISO-8859-3 (Latino 3) k.t.p.

Por Esperantistoj estas plej interesa la varianto Latino 3. Ĝi enhavas niajn supersignajn literojn, sed ankaŭ literojn de ekz. la Malta lingvo.

Unu problemo pri Latino 3 estas, ke la literoj ĥ kaj ĵ okupas kodpoziciojn, kiuj en Latino 1 estas okupataj de signoj, kiuj tute ne estas literoj. Tial, se oni provas uzi Latinon 3 en programo, kiu estas farita por Latino 1 (plej multaj programoj!), tiuj du literoj povas konduti strange. La programoj ekz. plej ofte tute ne rekonas, ke ĥ kaj Ĥ estas du variantoj de la sama litero (minusklo kaj majusklo), sed traktas ilin kiel du tute senrilatajn signojn (same pri ĵ kaj Ĵ). Ankaŭ aliaj ĝenaĵoj povas aperi. Efektive oni tute evitu uzi Latinon 3 nuntempe. Por Esperanto Unikodo estas multe pli taŭga.

Jen tabelo de Latino 3 (krom tiu parto, kiu identas kun Askio).

La Vindoza signokodo

La Vindoza signokodo Windows-1252 (“WinLatin1”, CP-1252) estas tre simila al ISO 8859-1 (Latino 1), sed ĝi ne estas identa al tiu.

En ISO 8859-1 la kodaj pozicioj 128 - 159 estas rezervitaj por stirado. Ili ne respondas al grafikaj signoj. En Windows-1252 iuj el tiuj pozicioj tamen reprezentas preseblajn signojn, kiel ekz. haltostreko, ĝis-streko, kaj fabriksimbolo. La signorepertuaro estas do pli vasta ol tiu de ISO Latino 1.

Se oni uzas bitokojn inter 128 kaj 159 en programo, kiu supozas, ke la datumoj estas laŭ ISO 8859-1, tio povas doni ĉian ajn rezulton. En la plej malbona okazo ili estas interpretataj kiel stirsignoj kun ofte tre stranga rezulto.

Jen tabelo de tiuj signoj, kiuj estas apartaj por la Vindoza signokodo.

Aliaj vastigoj de Askio

Ekzistas pluraj signokodoj, kiuj estas vastigoj de Askio. ISO 8859-1 mem estas nur membro de tuta signokoda familio ISO 8859. Sed ekzistas ankaŭ aliaj vastigoj de Askio. Multaj el ili estas tre malsimilaj al ISO 8859-1. Ekz. la koda pozicio 228 estas en ISO 8859-1 okupata de ã (la litero a kun tremao), en la signokodo Roman-8 de HP ĝi estas okupata de ð (la Islanda litero edo), en la DOS-a kodpaĝo 850 ĝi estas okupata de õ (la litero o kun tildo), kaj en la Makintoŝa signokodo ĝi estas okupata de la sumiga simbolo (simila al la Greka litero sigma).

Ĝenerale aŭtomata konvertado inter la ĉi-antaŭe menciitaj signokodoj ne estas ebla. Ekz. la Makintoŝa signorepertuaro enhavas la Grekan literon pi, kiu tute ne ekzistas en Latino 1.

ISO 10646 (UCS) kaj Unikodo «

ISO 10646 = UCS = la Universala Signaro (“Universal Character Set”), ankaŭ nomata la “Universala Alfabeto”, estas ekstreme vasta signa repertuaro kaj kodo, kiu ebligas pli ol du miliardojn da kodpozicioj! UCS estas vastigo de ISO Latino 1, de ĝia signorepertuaro kaj de ĝia signokodo en la sama senco kiel ISO Latino 1 estas vastigo de Askio.

Unikodo estas normo, kiun ellaboras la Unikoda Konsorcio en strikta kunlaboro kun ISO por teni Unikodon konforma kun UCS. Unikodo estas signorepertuaro kaj signokodo baze identa al USC, sed Unikodo difinas kelkajn pliajn informojn pri la signoj. Komence Unikodo estis strikte 16-bita kodo, kaj ampleksis nur la unuan “ebenon” de UCS (la “Baza Multlingva Ebeno” = la unuaj 65535 kodpozicioj de UCS), sed tio rapide montriĝis nesufiĉa nombro de signoj. Tial Unikodo estis vastigita kaj estas nun tute sufiĉe ampleksa por ĉiuj ekzistantaj homaj lingvoj. Ĝisdate por 96382 el la kodpozicioj de Unikodo oni efektive difinis signojn (en Unikodo versio 4.0.0 publikigita en Aprilo 2003).

Ofte oni referencas al Unikodaj signoj per notacio en la formo U+nnnn (aŭ simile), kie nnnn estas kvar deksesumaj ciferoj. Ekz. U+0020 indikas la spacetan signon (kun kodvaloro 20 deksesume, 32 dekume). Rimarku, ke tiaj notacioj identigas signon per ĝia Unikoda valoro sen indiki ian certan kodprezenton.

Jen detala tabelo de tiu parto de Unikodo, en kiu troviĝas la Esperantaj supersignaj literoj.

La kodprezento UTF-16

UTF-16 estas Unikoda kodprezento, kiu principe prezentas ĉiun signon per unu bitdekseso kun la sama valoro kiel la numero de la signo. En la praktiko temas tamen plej ofte pri du sinsekvaj bitokoj (8 + 8 = 16). Tio estas tre evidenta kaj simpla kodprezento. Tamen ĝi povas esti neefika por iuj lingvoj. Ekz. UTF-16-a prezento de Anglalingva teksto, aŭ alia teksto, kiu enhavas nur signojn de ISO Latino 1, fariĝas duoble tiel granda kiel la sama teksto prezentita laŭ ISO 8859-1. UTF-16 tamen ne plu estas strikte 16-bita kodo. Pere de la tiel nomataj surogataj signoj ĉiam uzataj en paroj (po 2 bitdeksesoj por ĉiu signo) oni povas esprimi ankoraŭ ĉirkaŭ unu milionon da signoj per UTF-16.

La kodprezento UTF-8

En UTF-8 ĉiu UCS-a signo sub 128 (la Askia repertuaro) estas prezentata “senŝanĝe”, per unu bitoko. Ĉiuj aliaj signoj de UCS aŭ Unikodo estas prezentataj, laŭ sufiĉe malsimpla metodo, per po du ĝis ses bitokoj, el kiuj ĉiu estas inter 128 kaj 255. Por ĉiuj jam difinitaj Unikodaj signoj sufiĉas po tri bitokoj. UTF-8 estas ĉiam pli kaj pli uzata, ekz. en HTML-paĝoj, en retpoŝto k.s.

Se en ekz. la fontokodo de HTML-paĝo vi vidas strangajn sekvencojn similajn al Ĥ, Ä¥, Å¡, ﮡ, ﮲..., vi verŝajne renkontis UTF-8-an tekston (kiun la programo tamen ne sukcesis ĝuste interpreti).

La kodprezento UTF-7

En UTF-7 ĉiu Unikoda signo estas prezentata kiel sinsekvo de unu aŭ pli da bitokoj inter 0 kaj 127. Plej multaj Askiaj signoj estas prezentataj senŝanĝe, ĉiu kiel po unu bitoko, sed iuj bitokaj valoroj estas rezervitaj kiel “eskapsignoj”, kiuj montras, ke tiu bitoko kune kun certa nombro de sekvaj bitokoj formas plurbitokan prezenton de iu signo. UTF-7 estas malpli oportuna ol UTF-8, kaj estas multe malpli ofte uzata.

Se en ekz. la fontokodo de retpoŝta mesaĝo vi vidas sekvencojn similajn al +AOQ-, +AKE-..., vi verŝajne renkontis (miskomprenitan) UTF-7-an tekston.

La nocio signo

La nocio signo estas baza por la aferoj ĉi tie diskutataj, sed ĝin difini ekzakte estas malfacile.

La Unikoda normo priskribas signojn kiel “la plej malgrandajn skriblingvajn komponantojn kun signifovaloro”, kio estas iom misgvida. Litero apenaŭ estas portanto de signifo per si mem. Plie, signo kiel ú (la litero u kun dekstrakorna supersigno) povas estas rigardata kiel du signoj: litero kaj supersigno. Kaj fakte en Unikodo la difino de signo estas la jena:

abstrakta signo: inform-unuo uzata por organizado, regado, kaj reprezentado de tekstaj datumoj

(Laŭ la Unikoda terminologio abstrakta signo estas signo kiel elemento de signorepertuaro, dum signo indikas “koditan signo-reprezenton”, kio efektive estas kodvaloro. Konfuze, ĉu ne?)

Estas grave distingi la nocion signo disde la nocio signobildo. Signobildo estas konkreta formo, kiun signo povas havi, kiam ĝi estas montrata. Ekz., la signo Z povas esti prezentata kiel grasa Z, aŭ kiel kursiva Z, sed ĝi daŭre estas la sama signo. (Aliflanke, minuskla z estas difinita kiel aparta signo - kiu siavice povas havi diversajn signobildajn prezentojn.)

Repertuaro de signobildoj konsistigas tiparon.

Signorepertuaro difinas la identecon de signoj. Ekz., la Askia repertuaro enhavas signon nomatan dividostreko. Ĝi estas uzata ankaŭ kiel minusa signo (kaj krome ankaŭ kiel anstataŭaĵo por ĝis-streko kaj haltostreko, ĉar tiaj signoj mankas en Askio). Do, tiu Askia signo estas komuna plurcela signo, kaj oni povas diri, ke en Askio dividostreko kaj minuso estas identaj. Sed en Unikodo ekzistas apartaj signoj nomataj dividostreko kaj minus-signo (kaj ankaŭ apartaj ĝis-streko kaj haltostreko). Por interkongrueco ankaŭ la malnova Askia signo estas konservata en Unikodo (en sia malnova koda pozicio, kun la nomo dividostreko-minuso).

Simile Unikodo difinas signojn por la om-simbolo, la mikro-prefikso, k.t.p., kiel apartajn disde tiuj Grekaj literoj, de kiuj ili originas (majuskla omega, minuskla mu, k.t.p.). Tio estas logika distingo, kaj ĝi ne necesigas, ke diversaj signobildoj estu uzataj. La distingo estas grava ekz. kiam tekstaj datumoj en cifereca formo estas traktataj de programo (kiu “vidas” la kodajn valorojn, pere de ia kodprezento, kaj tute ne la signobildojn). Rimarku, ke Unikodo ne distingas inter la minuskla Greka litero pi, kaj la matematika simbolo pi... Aliflanke ĝi ja distingas inter majuskla Greka pi, kaj la matematika simbolo por n-uma produto. (Se vi pensas, ke tio ne sonas tute logike, vi ne estas sola.)