[ Impressum ]

Konvertierung zwischen ISO 8859-1 und Unicode

www.Rozek.de > LiveCode > ISO 8859-1 and Unicode
Kommt ein 8-Bit Zeichensatz zum Einsatz (wie unter LiveCode [1] üblich), wird dies in Westeuropa (und auf Nicht-Mac-Rechnern) vermutlich der Zeichensatz ISO 8859-1 (Latin-1) [2] sein.

Für global einsetzbare Anwendungen ist Unicode [3] jedoch viel praktischer. An dieser Stelle sollen deshalb die Konvertierungen zwischen ISO 8859-1 und Unicode genauer untersucht werden.

Von ISO 8859-1 nach Unicode…und wieder zurück

Wer einen Blick in die Dokumentation zu uniEncode wirft, wird sich vermutlich wundern, daß dort zwar eine Reihe von "Sprachen" aufgeführt sind (selbst "roman" taucht dort auf) - west-europäische Sprachen sucht man dort aber vergebens ("english" ist ein nicht ganz glücklich gewähltes Synonym für den normalen ASCII-Zeichensatz [4]).

Wer aber weiß, daß ISO 8859-1 mit der ersten Code Page im Unicode identisch ist, findet schnell heraus, wie man diesen Zeichensatz (zumindest auf Nicht-Mac-Rechnern) konvertieren kann:

get uniEncode(ISOtext)
get uniDecode(UnicodeText)

man verzichtet einfach ganz auf die Angabe einer Sprache!

Zusätzlich muß man jedoch auch den Funktionen NumToChar und CharToNum noch mitteilen, ob man gerade mit Unicode arbeitet oder mit einem 8-Bit Zeichensatz:

set the useUnicode to true

schaltet auf Unicode um und

set the useUnicode to false

schaltet wieder zurück in den 8-Bit-Modus.

Zur Kontrolle soll wieder einmal die tabellarische Anzeige des verwendeten Zeichensatzes herangezogen werden:

--------------------------------------------------------------------------------
-- showISOasUnicode displays an ISO 8859-1 character table --
--------------------------------------------------------------------------------

command showISOasUnicode
set the useUnicode to false

putISOintoMsg empty
putISOafterMsg " |-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F | " & LF
putISOafterMsg "---+------------------------------------------------+---" & LF
putISOafterMsg "0- | | 0-" & LF
putISOafterMsg "1- | | 1-" & LF

repeat with Row = 2 to 15
putISOafterMsg format("%1X- |", Row) # start new table row

repeat with Col = 0 to 15
local CharCode; put Row*16 + Col into CharCode
if ((CharCode >= 32) and (CharCode < 127)) or (CharCode >= 160) then
putISOafterMsg " " & NumToChar(CharCode) & " " # show printable char
else
putISOafterMsg " " # skip non-printable characters
end if
end repeat

putISOafterMsg format("| %1X-", Row) & LF # end table row
end repeat

putISOafterMsg "---+------------------------------------------------+---" & LF
putISOafterMsg " |-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F | " & LF
end showISOasUnicode

command putISOintoMsg ISOtext
set the UnicodeText of field "Results" of card "Single Line" \
of stack "Message Box" to uniEncode(ISOtext)
end putISOintoMsg

command putISOafterMsg ISOtext
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") & uniEncode(ISOtext)
end putISOafterMsg

Auf einem Nicht-Mac-Rechner führt dieses Skript, von der Kommandozeile der LiveCode "Message box" aus aufgerufen, zu folgender Ausgabe:

|-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F |
---+------------------------------------------------+---
0- | | 0-
1- | | 1-
2- | ! " # $ % & ' ( ) * + , - . / | 2-
3- | 0 1 2 3 4 5 6 7 8 9 : ; < = > ? | 3-
4- | @ A B C D E F G H I J K L M N O | 4-
5- | P Q R S T U V W X Y Z [ \ ] ^ _ | 5-
6- | ` a b c d e f g h i j k l m n o | 6-
7- | p q r s t u v w x y z { | } ~ | 7-
8- | | 8-
9- | | 9-
A- |   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ | A-
B- | ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ | B-
C- | À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï | C-
D- | Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß | D-
E- | à á â ã ä å æ ç è é ê ë ì í î ï | E-
F- | ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ | F-
---+------------------------------------------------+---
|-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F |

Sollte die angezeigte Tabelle aufgrund der Verwendung eines Fonts mit variabler Schriftbreite nicht sauber ausgerichtet angezeigt werden, kann man sich mit folgendem Kommando behelfen:

set the TextFont of field "Results" of card "Single Line" of stack "Message Box" to "Courier New"

Anschließend muß showISOasUnicode erneut aufgerufen werden.

ISO 8859-1 auf einem Mac (mit Unicode)

Leider funktioniert das Skript showISOasUnicode nicht auf einem Mac-Rechner: ganz offensichtlich ist nämlich zumindest die Beschreibung zu uniEncode und uniDecode falsch! Auf einem Mac sind die Aufrufe von uniEncode und uniDecode nämlich mit denen identisch, die explizit von und nach MacRoman konvertieren.

Verwendet man einen Mac und muß einen Text von oder nach ISO 8859-1 umwandeln, so hilft nur noch eine selbstgeschriebene Konvertierung weiter:

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

function ISO2Unicode ISOtext # should be used on Macs only!
local Outcome; put empty into Outcome
repeat for each character ISOchar in ISOtext
put ISOchar & null after Outcome
end repeat
return Outcome
end ISO2Unicode

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

function Unicode2ISO UniText # should be used on Macs only!
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
end Unicode2ISO

Verwendet man die gezeigten Funktionen für die Konvertierung, so kann das zuvor gezeigte Skript zur Darstellung einer ISO 8859-1 Zeichentabelle für Mac-Rechner umgeschrieben werden:

--------------------------------------------------------------------------------
-- showISOonMac displays an ISO 8859-1 character table on a Mac --
--------------------------------------------------------------------------------

command showISOonMac # for Macs only!
set the useUnicode to false

putMacISOintoMsg empty
putMacISOafterMsg " |-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F | " & LF
putMacISOafterMsg "---+------------------------------------------------+---" & LF
putMacISOafterMsg "0- | | 0-" & LF
putMacISOafterMsg "1- | | 1-" & LF

repeat with Row = 2 to 15
putMacISOafterMsg format("%1X- |", Row) # start new table row

repeat with Col = 0 to 15
local CharCode; put Row*16 + Col into CharCode
if ((CharCode >= 32) and (CharCode < 127)) or (CharCode >= 160) then
putMacISOafterMsg " " & NumToChar(CharCode) & " " # show printable char
else
putMacISOafterMsg " " # skip non-printable characters
end if
end repeat

putMacISOafterMsg format("| %1X-", Row) & LF # end table row
end repeat

putMacISOafterMsg "---+------------------------------------------------+---" & LF
putMacISOafterMsg " |-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F | " & LF
end showISOonMac

command putMacISOintoMsg ISOtext
set the UnicodeText of field "Results" of card "Single Line" \
of stack "Message Box" to ISO2Unicode(ISOtext)
end putMacISOintoMsg

command putMacISOafterMsg ISOtext
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") & ISO2Unicode(ISOtext)
end putMacISOafterMsg

Dieses Skript nutzt die Eigenschaft, daß die in den Text-Literalen verwendeten Zeichen (z.B. "--+--+--", mit Codes < 127) aufgrund ihrer Verwendung im auf allen Rechnern eingesetzten ASCII-Zeichensatz sowohl in MacRoman als auch in ISO 8859 identisch sind - Unterschiede treten erst für die Codes >= 128 auf.

Diese Annahme stimmt fast immer: leider kennt MacRoman noch ein weiteres Leerzeichen (mit dem Zeichencode 202), welches schnell (vermutlich versehentlich) eingegeben, aber nur schwer erkennbar ist: drückt man Shift und die Leertaste gleichzeitig, erhält man das alternative Leerzeichen - dieses belegt aber im Zeichensatz ISO 8859-1 die Position des Zeichens "Ê". Ist die Ausgabe also mit solchen "Ê" durchsetzt, muß man im Originaltext offensichtlich ein paar Leerzeichen "säubern"...

ISO 8859-1 auf einem Mac (ohne Unicode)

"Natürlich" stellt LiveCode von Haus aus eigene Funktionen zur Konvertierung zwischen MacRoman und ISO 8859-1 zur Verfügung:

get MacToISO(MacText)
get ISOtoMac(ISOtext)

da die beiden Zeichensätze jedoch nicht deckungsgleich sind (jeder der beiden Zeichensätze enthält Zeichen, die im jeweils anderen nicht vorkommen), besteht bei einer Konvertierung stets die Gefahr eines Informationsverlustes.

Die Funktionen MacToISO und ISOtoMac sollten deshalb auf gar keinen Fall verwendet werden - stattdessen ist grundsätzlich der Umstieg auf Unicode zu empfehlen!

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]
(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. [...]"
[3]
(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. [...]"
[4]
(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. [...]"