A Tcl programozási nyelv

Nyelvi elemek



Jelkészlet, azonosítók

Egy Tcl script parancsok nem üres sorozata. A parancsokat újsor vagy pontosvessző (';') karakter választja el egymástól. A záró szögletes zárójel (']') is jelezheti parancs végét, lásd a parancshelyettesítést. Egy parancsot egy vagy több, egymástól szóközökkel vagy tabulátorokkal elválasztott szó alkot (tulajdonképpen a parancs egy Tcl lista).

A Tcl mindenhol különbséget tesz a kis- és nagybetűk között: a parancsok és a változók nevében és a tömbindexekben is.

Megjegyzések

Ha a kettős kereszt karakter ('#') szintaktikailag olyan helyen áll, amelyen potenciálisan egy parancs első szavának első karaktere állhatna, akkor a Tcl interpreter a kettős keresztet és az azt a sor végéig követő karaktereket megjegyzésnek tekinti és figyelmen kívül hagyja. A megjegyzéskarakternek csak parancs első karaktereként adott ez a szerepe.

Karakterkészletek és kódolások

A Tcl nyelv karakterkódolásra a 16 bites Unicode szabványt használja, habár párhuzamosan több karakterkészlettel is képes együttműködni, Unicode-ra konvertálva azokat.

A rendszer kódja

Minden számítógép-rendszernek van egy standard karakterkódolása, melyről a beolvasott fájlokat a Tcl automatikusan Unicode-ra konvertálja. Fájlok írásakor a Tcl ugyancsak elvégzi az automatikus konverziót, Unicode-ról a rendszerkódra. A encoding system paranccsal lekérdezhetjük a rendszerkódot.

encoding system
cp1252
A cp a code page - kódlap rövidítése.

A következő paranccsal megváltoztathatjuk a rendszer alapértelmezett karakterkódolását: encoding systemencoding Azonban, ha csak lehetséges, ajánlott ennek használatát elkerülni, ugyanis ha az operációs réndszer által éppen használt kódolástól eltérő kódot állítunk be, a Tcl valószínűleg nem fog tudni megfelelően kommunikálni vele.

encoding names Kilistázza az összes Tcl által ismert kódolást. A karakterkódolások fájlokban vannak rögzítve, az encoding könyvtár alatt a Tcl script könyvtárban. A megfelelő fájl a kódolás első használatakor automatikusan töltődik be.

Fájl kódolások és az fconfigure

A Tcl a fájlok megnyitásakor automatikus konverziót végez a rendszer alapértelmezett karakterkódolásáról a Unicode kódra. Ha a rendszerkódolásától eltérő karakterkódolású fájlt akarunk megnyitni, akkor az fconfigure parancsot használhatjuk a kódolás megadásához. Például a következő programkódot használhatjuk egy standard orosz karakterkódolású fájl megnyitásakor:

set in [open README.russian] fconfigure $in -encoding iso8859-7

Különböző kódolású scriptek

Ha a rendszerkódtól eltérő kódolású scriptekkel dolgozunk, nem használhatjuk a source parancsot beolvasásukra. Azonban könnyen beolvashatjuk a fájlokat a megfelelő kódolással, és használhatjuk az eval eljárást a meghívásukra.

A következő példa egy encoding flag-et ad a source parancshoz. Valószínűleg a Tcl későbbi verzióiban ez már beépített eljárás lesz

proc Source {args} {
   set file [lindex $args end]
   if {[llength $args] == 3 &&
          [string equal -encoding [lindex $args 0]]} {
      set encoding [lindex $args 1]
      set in [open $file]
      fconfigure $in -encoding $encoding
      set script [read $in]
      close $in
      return [uplevel 1 $script]
   } elseif {[llength $args] == 1} {
      return [uplevel 1 [list source $file]]
   } else {
      return -code error \
         "Usage: Source ?-encoding encoding? file?"
   }
}

Unicode és az UTF-8

Az UTF-8 egy Unicode kódolás. Míg az Unicode 16 biten ábrázol minden karaktert, az UTF-8 használ 8, 16, 24 bitet is egy-egy Unicode karakter kódolásához. Ez a változó szélességű karakterkódolás hasznos, mivel az ASCII karaktereket 8 biten ábrázolja, így egy ASCII string, amely a 128 alatti kódokat használja, egyben UTF-8 string is. A Tcl belső működése során felhasználja az UTF-8 kódolást az Unicode-ra konvertáláshoz. Megengedi olyan Tcl kiterjesztésekkel való együttműködést is, amelyek nem Unicode-ot használnak, hanem ASCII stringeket küldenek a Tcl-nek.

Tcl script írójaként nem kell különösebben az UTF-8-al törődnünk, nyugodtan gondolhatunk a Tcl-re, mint 16 bites Unicode-ot használó nyelvre. Ha viszont Tcl kiterjesztést írunk C vagy C++ nyelven, akkor az UTF-8 hatása sokkal láthatóbb lesz.

Bináris kódolás

Amennyiben adatfájlok olvasásakor és írásakor ki akarjuk kerülni a karakterkódolási konverziókat, használhatjuk a bináris kódolást.

fconfigure $in -encoding binary

Bináris kódolás során a Tcl minden beolvasott 8 bitet egy 16 bites Unicode karakter alsó 8 bitjén tárolja, a felső 8 bitet pedig nullákkal tölti fel. Bináris fájlok írásakor pedig minden Unicode karakter alsó byte-át írja ki. Láthatjuk, hogy így egy bináris állomány beolvasása, majd kiírása nem változtat az adaton. Figyeljünk azonban arra, hogy ha egy bármilyen más karakterkódolással olvasunk be egy fájlt, majd binárisan írjuk ki,, a karakterek felső byte-ja el fog veszni!

Valójában a Tcl a bináris állományokat ettől hatékonyabban kezeli, de logikailag a fent leírtak pontosak. Mivel a Tcl nem csak stringként tud adatot tárolni, ezért bináris állomány olvasásakor a Tcl 8 bites byte-okból álló ByteArray formájában tárolja. Viszont amint hozzáférünk ehhez az adathoz, a Tcl automatikusan 16 bites Unicode karakterré alakítja őket, a felső byte kinullázásával.

A binary parancs is ByteArray formájában manipulálja az adatokat. Ha bináris állományt olvasunk be, majd a binary paranccsal dolgozzuk fel, a Tcl az adatokat a hatékonyabb, 8 bites formában tartja.

A string parancs is képes kezelni a ByteArray formátumot, így a string length, a string range, a string index parancsok bináris adatokon hatékonyan működnek, elkerülve a felesleges UTF-8-ra való konvertálást.

Konvertálás különböző kódolások között

Az encoding parancsot használhatjuk egy string más karakterkódolásúvá konvertálásához. Az encoding convertfrom Unicode kódolásra konvertál. Az encoding convertto pedig Unicode-ról más kódra konvertál.

A következő két példa ekvivalensek, mindkettő Big5 kódolású adatfájlt olvas be, és Unicode-ra konvertálja:

fconfigure $input -encoding gb12345
set unicode [read $input]

vagy:

fconfigure $input -encoding binary
set unicode [encoding convertfrom gb12345 [read $input]]

Általában Unicode-ról más kódolásra való áttéréskor adatot veszíthetünk, ezért érdemes tudni a kívánt kódolás határait. Különösen bináris kódolásra való konverziónál nagy a veszélye, hogy a kiinduló tetszőleges Unicode adat elvész. Hasonlóan egy iso8859-2 vagy ehhez hasonló kódolás esetén nagy valószínűséggel nincs megfelelő reprezentációja egy Unicode kódú karakternek.