[ Impressum ]

LiveCode und Zeichensätze

www.Rozek.de > LiveCode > CharacterSets
LiveCode [1] und seine Verwendung von Zeichensätzen waren schon immer ein Problem, wenn es darum ging, Anwendungen zu schreiben, die auf unterschiedlichen Plattformen lauffähig sein sollten.

Diese Notiz soll versuchen, Klarheit in dieses Thema zu bringen - dabei werden aber nur Details beschrieben, die nicht schon in [2] erläutert wurden.

Technischer Hintergrund

Die technische Ursache für dieses Übel besteht darin, daß ein Rechner intern (vereinfacht ausgedrückt) stets nur Zahlen im Bereich von 0 bis 255 speichert - und es eine Sache der Interpretation ist, ob diese Zahlen in Wirklichkeit als Buchstaben behandelt werden sollen. Zu diesem Zweck ordnet man jeder Zahl einen Buchstaben (bzw. ein Sonderzeichen) zu, damit der Rechner stets weiß, welche Zahl er als welches Zeichen anzuzeigen hat - bzw. umgekehrt: welche Zahl er intern speichern muß, wenn der Benutzer über die Tastatur ein Zeichen eingibt. Diese Zuordnung nennt man "Zeichensatz" (character set) oder präziser "Code Page" - was nicht mit den Elementen einer "Schrift" zu verwechseln ist, die angeben, wie ein bestimmtes Zeichen am Ende auf einem Bildschirm aussehen soll.

Der "ASCII"-Zeichensatz (American Standard Code for Information Interchange [3]) definiert die Belegung der Codes 0 bis 127 - was für englische Texte ausreichen mag, international aber bei weitem zu wenig ist. Darüber hinaus gab es früher auf nicht grafikfähigen Anzeigen den Wunsch nach rudimentären grafischen Ausgaben - z.B. zur Darstellung von Tabellen mit Rahmen und Trennstrichen.

Als Folge hiervon wurden eine Reihe von Zeichensätzen definiert, die den ASCII-Zeichensatz um eine Belegung der Codes 128 bis 255 erweitern und darin z.B. Umlaute, Diakrit-Zeichen oder Symbole festlegen. In Europa sind die Zeichensätze der Normenfamilie ISO 8859 [4] von Bedeutung, in Deutschland insbesondere der Zeichensatz ISO 8859-1 (Latin-1).

Heutzutage treten die 8-Bit-Zeichensätze (für die Codes 0 bis 255) immer mehr zugunsten von Unicode [5] (für die Codes 0 bis derzeit 1114111, Unicode 2.0) in den Hintergrund, da die Rechner inzwischen über ausreichende Kapazität verfügen und eine einheitliche Zeichenkodierung die umständliche und fehlerträchtige Erkennung des "korrekten" Zeichensatzes sowie eine evtl. erforderliche Umwandlung unnötig macht. Um auch Zeichencodes oberhalb von 255 platzsparend in Byte-Form (d.h. mit Zahlen von 0 bis 255) darstellen zu können, werden Unicode-Texte häufig im Format UTF-8 [6] gespeichert - andere Formate sind z.B. UTF-16 oder UTF-32.

LiveCode und seine Zeichensätze

Livecode verfügt inzwischen zwar über eine Unicode-Unterstützung [2], arbeitet von Haus aus aber zunächst mit 8-Bit Zeichensätzen. Auf den meisten Plattformen dürfte dabei der Zeichensatz ISO 8859-1 (Latin-1) zum Einsatz kommen, auf Mac-Rechnern wird jedoch immer noch der Zeichensatz MacRoman eingesetzt.

In Plattform- und Länder-übergreifend einsetzbaren Anwendungen sollte eigentlich nur noch der Unicode-Zeichensatz verwendet werden - wodurch allerdings das Problem entsteht, zwischen "lokalen" (von LiveCode intern verwendeten) Zeichensätzen und Unicode hin und her wandeln zu müssen.

Lokale Zeichensätze und Unicode

Entgegen der Dokumentation scheinen die Funktionen

get uniEncode(ISOtext)
get uniDecode(UnicodeText)

ohne explizite Angabe einer Sprache stets zwischen dem lokalen Zeichensatz und Unicode hin und her zu wandeln - insbesondere auch unter Mac OS X - was eigentlich ganz praktisch ist.

ISO 8859-1 und Unicode

Will man jedoch auf einem Mac zwischen ISO 8859-1 und Unicode konvertieren so gelingt dies mit den von LiveCode bereitgestellten Funktionen nicht mehr - stattdessen muß man selbst Hand anlegen:

--------------------------------------------------------------------------------
-- ISO2Unicode converts a given ISO 8859-1 text into Unicode --
--------------------------------------------------------------------------------

function ISO2Unicode ISOtext
if (the Platform is "MacOS") then
local Outcome; put empty into Outcome
repeat for each character ISOchar in ISOtext
put ISOchar & null after Outcome
end repeat
return Outcome
else
return uniEncode(ISOtext)
end if
end ISO2Unicode

--------------------------------------------------------------------------------
-- Unicode2ISO converts a given Unicode text into ISO 8859-1 --
--------------------------------------------------------------------------------

function Unicode2ISO UniText
if (the Platform is "MacOS") then
local Outcome; put empty into Outcome
local toBeSkipped; put true into toBeSkipped
repeat for each character UniChar in UniText
if (not toBeSkipped) then put UniChar after Outcome
put not toBeSkipped into toBeSkipped
end repeat
return Outcome
else
return uniDecode(UniText)
end if
end Unicode2ISO

Die gezeigten Skripte funktionieren sowohl auf Macs als auch auf anderen Rechnern, können also immer eingesetzt werden.

Unicode-Ausgabe in die Message Box

Die LiveCode "Message Box" wird gerne für interaktive Experimente sowie für die Ausgabe von Testmeldungen verwendet. Das Kommando

put "some text"

verwendet aber leider stets den lokalen, internen Zeichensatz. Will man einen Text im Unicode anzeigen, muß man auf folgende Anweisungen ausweichen:

command putUniIntoMsg UniText
set the UnicodeText of field "Results" of card "Single Line" \
of stack "Message Box" to UniText
end putUniIntoMsg

command putUniAfterMsg UniText
set the UnicodeText of field "Results" of card "Single Line" \
of stack "Message Box" to (the UnicodeText of field "Results" \
of card "Single Line" of stack "Message Box") & UniText
end putUniAfterMsg

Alle hier gezeigten Skripte sind Teil der "BasicLib" des Autors.

Literaturhinweise

[1]
(RunRev Ltd.)
LiveCode | Create apps for multiple platforms. Quickly. Easily. Free
LiveCode ist eine (dem legendären HyperCard von Apple) nachempfundene Entwicklungsumgebung sowohl für stationäre (Windows, Linux, MacOS X) als auch für mobile (IOS, Android) Anwendungen. Ein visueller Editor ermöglicht den schnellen Entwurf von Bedienoberflächen, die der englischen Sprache nachempfundene Programmiersprache erlaubt auch Nicht-Programmierprofis die Entwicklung professioneller Anwendungen und das Konzept der "Modifikation am laufenden Programm" vereinfacht Test und Fehlerbehebung.
[2]
Devin Asay
LiveCode Lessons | How To - Getting Started with LiveCode | Unicode
Die "LiveCode Lessons" informieren über spezifische Eigenschaften und Funktionen von LiveCode - diese hier über den Umgang mit Unicode-Texten.
[3]
(Wikipedia)
American Standard Code for Information Interchange
Von der Web-Seite: "Der American Standard Code for Information Interchange [...] ist eine 7-Bit-Zeichenkodierung; sie entspricht der US-Variante von ISO 646 und dient als Grundlage für spätere, auf mehr Bits basierende Kodierungen für Zeichensätze. [...]"
[4]
(Wikipedia)
ISO 8859
Von der Web-Seite: "Die Normenfamilie ISO 8859 [...] der Internationalen Organisation für Normung definiert zurzeit in 15 verabschiedeten und einer verworfenen Teilnorm verschiedene 8-Bit-Zeichensätze für die Informationstechnik. [...]"
[5]
(Wikipedia)
Unicode
Von der Web-Seite: "Unicode [...] ist ein internationaler Standard, in dem langfristig für jedes sinntragende Schriftzeichen oder Textelement aller bekannten Schriftkulturen und Zeichensysteme ein digitaler Code festgelegt wird. [...]"
[6]
(Wikipedia)
UTF-8
Von der Web-Seite: "UTF-8 (Abk. für 8-Bit UCS Transformation Format, wobei UCS wiederum Universal Character Set abkürzt) ist die am weitesten verbreitete Kodierung für Unicode-Zeichen [...]"