Jump to content

Archived

This topic is now archived and is closed to further replies.

chain

[TUT] UTF-8 zum Laufen kriegen

Recommended Posts

  • Administrators
Hallo erstmal!

 

Da ich im IRC immer wieder auf Leute stoße, die UTF8-Zeichen nicht ordentlich lesen können, habe ich mir gedacht, ich schreibe eine kurze Anleitung, um Klarheit in die Sache zu bringen.

Diese soll Fragen klären, die Grundoptionen zeigen, ein sehr häufiges Problem darstellen und eine kurze Info für Scripter bereitstellen.

Also viel Spaß beim Lesen, hoffentlich kann ich etwas weiterhelfen

 

Gliederung

 

 

I.Einführung

II.UTF-8 Optionen in mIRC

III.Problemlösung

IV.Unicode-Scripting

 

Einführung

 

Fangen wir bei den Grundlagen an...

UTF-8 wird benötigt, um, unabhängig von der aktuell eingestellten Kodierung, Zeichen darstellen zu können, die aus anderen Kodierungen stammen.

So kann man beispielsweise Russisch oder sogar Chinesisch lesen, obwohl man selbst weiterhin in seiner normalen Westlichen Umgebung chattet.

Um die Sache mal stark zu vereinfachen: Solch einen Zeichensatz kann man sich vorstellen als eine Sammlung aus 255 Zeichen.

Im Regelfall unterscheidet sich die erste Hälfte - bis Zeichen Nummer 127 - nicht in den verschiedenen Kodierungen.

Darunter finden sich die gängigsten Zeichen, wie alle 26 Buchstaben des Alphabets, der Bindestrich, das Leerzeichen, usw.

Dinge, die von allen möglichen Leuten z.B. im Browser verwendet werden müssen, sind da immer enthalten.

Beim Ändern der Kodierung verändert man also im Normalfall nur die Zeichen 128 bis 255.

Dort befinden sich unsere deutschen Umlaute, das Euro-Zeichen, das Promille-Zeichen, dieser lustige Punkt • und sicherlich einige Abarten aus euren Ascii-Bildern... zumindest was die westliche Kodierung angeht.

Stellt man diese um, findet man plötzlich z.B. alle Buchstaben des kyrillischen Alphabets oder ähnliches vor.

Nun wurde irgendwann Unicode eingeführt, um den Problemen der richtigen Kodierung beim Lesen von Dokumenten entgegenzuwirken.

Dabei werden die betroffenen Zeichen als eine Kombination aus anderen Zeichen dargestellt.

So wird beispielsweise unser Ä zu Ä abgewandelt.

Natürlich sind durch diese Kombinationen weit mehr als die üblichen 127 Möglichkeiten gegeben, um Zeichen darzustellen, und so finden auch alle möglichen Zeichen darin Platz... egal aus welcher Kodierung sie eigentlich stammen.

(Ganz so einfach ist die Sache nicht, das Prinzip dahinter ist ein wenig anders - aber im Endeffekt läuft die Sache darauf hinaus.)

Wenn man nun also ein UTF8-fähiges Programm verwendet und die entsprechenden Optionen aktiviert hat, erkennt dieses die Codes und wandelt sie wieder in ihre ursprünglichen Zeichen um.

Dadurch wird es möglich, dass ich das hier alles nebeneinander setze: ÄÖÜ߀سشص๓๔๕ЙКЛМНО ...

 

UTF-8 Optionen in mIRC

 

Natürlich kann man Unicode auch im IRC nutzen.

mIRC selbst unterstützt UTF8 in Nachrichten erst seit Version 6.17... (Natürlich wäre eine neuere Version trotzdem zu empfehlen, da seit dem auch in diesem Gebiet bereits viele Fehler behoben wurden.)

Dazu gibt es generell zwei Orte, an denen man seine Optionen kurz Überprüfen sollte.

 

Den ersten Bereich findet man in den mIRC-Optionen [ALT] + [O], unter IRC -> Messages:

 

Was genau einige der Optionen bewirken, weiß ich auch nicht so wirklich.

In der Regel kann man das alles gefahrlos aktivieren.

Lediglich beim Font linking sollte man etwas aufpassen... in einigen seltenen Fällen führt diese Option zu kleinen Lags, falls UTF8 in Verbindung mit Farbcodes auftritt.

(Allerdings können ohne Font linking auch etwas weniger Zeichen dargestellt werden, das hängt von eurer Schriftart ab.)

UTF-8 display ist natürlich essentiell für unser Vorhaben, mindestens das sollte man aktiviert haben.

Ich denke mal, viel mehr muss ich zu diesem Teil nicht mehr erwähnen.

 

Anschließend sollte man seine Font-Einstellungen überprüfen: View -> Font.. (Bild)

Man landet in folgendem Menü:

 

Den relevanten Teil habe ich extra schon aufgeklappt!

Man hat hier 3 Optionen zur Auswahl... ich versuche mal, die grundlegenden Unterschiede basierend auf den vorigen Optionen aufzuzeigen:

 

 

•Default

Hier richtet sich die Einstellung ganz nach dem, was wir zuvor in den mIRC-Optionen festgelegt haben.

Da wir UTF8 aktiviert hatten, ist das natürlich bei Default auch an.

D.h. wenn jemand in Unicode schreibt, kann unser mIRC das wunderbar lesen.

•Display only

Hiermit verändert sich für uns praktisch nicht viel.

Da wir zuvor in der Standardoption sowieso UTF8 an hatten, wird immernoch alles gleich dargestellt.

Wäre die UTF8-Option in den Einstellungen aus, würde es hiermit eben trotzdem gehen.

Eine Kleinigkeit ist aber trotzdem anders:

Wenn man nämlich eine UTF8-Zeile aus dem Chat vor sich hat und diese kopiert, hat man verschiedene Ergebnisse in der Zwischenablage:

 

Code:

Zeile: 123 test äöü

Default-Kopie: 123 test äöü

Display-only-Kopie: 123 test äöü

Hat man also Default eingestellt, so kopiert man nicht direkt den Text, sondern den UTF8-Code dahinter.

Das kann für vllt. ein wenig sinnvoll für Scripter sein, die damit arbeiten möchten, aber den Normalverbraucher stört es sicher - damit hat Display only einen kleinen Vorteil.

•Display and encode

Das hier ist, was die Anzeige betrifft, genau das selbe wie Display only.

Allerdings schreibt man dann selbst auch in UTF8-Kodierung.

In der Regel fällt das bei den meisten Nutzern hier nur an den Umlauten auf, bei Leuten, die UTF8 aus irgend einem Grund nicht lesen können.

Mit dieser Option ist man selbst jedoch in der Lage, alles mögliche zu schreiben, ohne dass am Ende Fragezeichen im Chat stehen.

So kann ich zum Beispiel aller Welt meine Musikvorlieben verkünden: [NP] Слот - Пуля

Das könnte ich mit den anderen beiden Optionen nicht (direkt) schreiben.

Ihr könnt es ja gerne ausprobieren.

 

Bei dieser Einstellung sollte man darauf achten, dass man Set as default channel font anklickt, falls man es in allen Chans ändern möchte.

Andernfalls würde sich die Änderung nur um aktuellen Fenster bemerkbar machen.

Eventuell muss man danach kurz mIRC neustarten (um die Fenster alle neu zu öffnen) oder in den anderen Fenstern kurz Use default anklicken.

Für Querys und das Statusfenster muss man das übrigens nochmal separat machen.

 

Das wars eigentlich schon... damit habt ihr euer mIRC gerüstet, um fremde UTF8-Codes zu lesen und eventuell selbst welche zu produzieren.

...außer, das ganze klappt nicht so, wie geplant war.

 

Problemlösung

 

Es kommt sehr häufig vor, dass trotz aller richtigen Einstellungen die UTF8-Codes nicht richtig gelesen werden können.

 

Zitat:

Was nützt es dem Menschen, wenn er Lesen und Schreiben gelernt hat, aber das Denken anderen überläßt?

So schaut es dann aus, wenn man jemandem (wie mir) begegnet, der in der Regel UTF8 verwendet.

Natürlich stören die lustigen Zeichen beim Lesen ungemein und man würde sie am liebsten loswerden.

Aber warum werden sie eigentlich nicht richtig dargestellt?

 

In den meisten Fällen passiert das Leuten, die irgend eine Art von Theme-Engine in ihrem Script installiert haben.

So gut wie jedes Script verändert das Aussehen von Textausgaben, und genau da liegt der Unterschied.

 

Zitat:

02:14:47 Was nützt es dem Menschen, wenn er Lesen und Schreiben gelernt hat, aber das Denken anderen überläßt?

02:14:47 ¬ (Fanatic) Was nützt es dem Menschen, wenn er Lesen und Schreiben gelernt hat, aber das Denken anderen überläßt?

Im ersten Fall konnte die Nachricht richtig dargestellt werden, im zweiten nicht mehr.

In beiden Fällen wurden allerdings die selben Einstellungen verwendet... es muss also irgendwie an den Umgebungszeichen liegen.

 

Der Übeltäter ist in der Regel auch schnell gefunden...

Gehen wir zurück zum Ursprung dieses Tutorials.

Dort haben wir gesagt, dass unsere Zeichentabelle aus 255 verschiedenen Zeichen aufgebaut ist und nur die zweite Hälfte davon für uns interessant ist.

Hat man also UTF8-Encoding aktiviert, sollten eigentlich alle Zeichen mit Nummer 128-255 auch in Unicode-Format vorliegen.

Nun, wenn man sich die Nachricht ansieht, ist dies eigentlich auch der Fall... alle Umlaute und das ß wurden richtig umgewandelt.

Aber im zweiten Fall wurde durch ein Theme-Engine die Umgebung des Textes verändert - dort sind nun auch noch andere Zeichen zu finden.

Und genau hier liegt der Punkt: ¬ ist ein solches Zeichen, das eigentlich umgewandelt werden müsste. (Nummer 172)

Aber da dieses nicht vom eigentlich Urheber der Nachricht stammt, sondern von unserem Script da eingefügt wurde, liegt es immernoch in normaler Form vor.

mIRC unterscheidet allerdings nicht Nachrichtentext und "Drumherum" - es sieht die Zeile als Ganzes.

 

Da es im IRC keine Möglichkeit gibt, irgendwie seine verwendete Zeichenkodierung zu übermitteln, muss jeder Empfänger der Nachricht "raten", worum es sich handelt.

In der Regel wird UTF8 auch zuverlässig erkannt - in diesem Fall gibt es aber dieses Störzeichen.

mIRC sieht es - eigentlich hätte es umgewandelt sein müssen, ist es aber nicht.

Die Schlussfolgerung ist, dass der gesamte Text nicht in UTF8-Form vorliegt. (mIRC geht ja davon aus, dass die Zeile zusammen gehört.)

Also nimmt es an, dass alle Codes, die da irgendwie vorliegen, nur zufällig (oder sogar gewollt, um etwas zu zeigen) dort drin stehen und ... es zeigt einfach die Codes an, anstatt sie ordnungsgemäß umzuwandeln.

 

Wir wird man das Problem also los?

Am einfachsten ist, man verwendet ein anderes Theme. (Falls das eigene Script solch eine Möglichkeit bietet.)

Einige Script bieten auch einen Editor an, in dem man Themes bearbeiten kann... dort kann man solch störende Zeichen einfach durch ein anderes ersetzen.

Somit muss man nicht komplett auf sein Theme verzichten.

Gibt es allerdings keine Möglichkeit, das einfach zu umgehen, und fühlt man sich nicht fähig, selbst Hand am Script anzulegen, wird man sich wohl an den Autor wenden müssen.

Eine etwas angenehmere Endlösung, in der das Problem nicht nur umgangen wird, möchte ich nun vorstellen... diese geht allerdings in den Bereich des Scripting über.

 

Unicode-Scripting

 

Ich möchte nun zeigen, wie man das Problem am Beispiel des Theme-Editors im NNScript lösen kann.

Das Prinzip sollte daran eigentlich deutlich werden und auf alle möglichen anderen Situationen übertragbar sein.

 

Wir gehen von folgendem Problem aus:

UTF8-Nachrichten können in Actions (/me) nicht richtig dargestellt werden.

Einige Beispiel-Zeilen:

 

Zitat:

(02:42:39) ••• Fanatic probiert mal eben etwas aus.

(02:43:05) ••• Fanatic findet, das klappt doch eigentlich ganz gut.

(02:43:22) ••• Fanatic probiert mal kurz Umlaute aus: Äpfel - äöü

Nach dem, was wir eben gelesen haben, ist der Übeltäter natürlich schnell erkannt.

Durch die •••, die in Reinform vorliegen, meint mIRC, der gesamte Text sei unkodiert.

Nun finden wir unser Theme aber so schick und möchten es nicht ändern oder anpassen... eigentlich kein Problem

Wir rufen also den Editor auf:

 

Unsere drei Störzeichen befinden sich also im Prefix, sprich, sie sind das

 im Theme.

Was tun wir also damit, um die Ausgabe ungestört zu ermöglichen...

 

Code:

Vorher:

Neu: $iif($isutf() == 2, $utfencode(

), 
)

Und siehe da ...

 

Unsere Erweiterung prüft durch $isutf, ob der empfangene in Unicode-Form vorliegt.

Falls ja, werden unsere Störzeichen durch $utfencode unschädlich gemacht, indem sie selbst in UTF8-Form gebracht werden... dadurch ist wieder alles in Ordnung, die Zeile kann richtig dargestellt werden.

Andernfalls (falls kein UTF8 vorliegt) werden sie ganz normal dargestellt... kein UTF8, keine Probleme.

Die hier verwendeten Funktionen sind bisher nicht! in der mIRC-Help dokumentiert. (Obwohl wir KMB einmal darauf angesprochen haben... er scheint es wieder vergessen zu haben.)

Deswegen führe ich sie hier mal (sehr) kurz auf:

 

 

•$isutf(Text)

...zeigt den UTF8-Status des Textes an.

Dabei gilt:

 

◦0 = Kein UTF8 (enthält Störzeichen)

◦1 = Scheint normaler Text zu sein (enthält nur Zeichen

◦2 = Scheint gültigen UTF8-Code zu enthalten

•$utfencode(Text) / $utfdecode(Text)

...(de)kodiert UTF8.

 

◦$utfencode(äöü) = äöü

◦$utfdecode(Äpfel) = Äpfel

 

Die hier aufgeführte Lösung ist natürlich noch etwas knapp gehalten.

Wenn man dies von Anfang an in sein Script integrieren möchte, sollte man zusätzlich prüfen, ob der Nutzer überhaupt UTF8 darstellen möchte.

Es müssen also genau die Optionen ausgelesen werden, die wir zuvor besprochen haben... die Haupt-Einstellungen und das Font-Menü.

Beides findet man in der mIRC.ini.

 

Code:

[language]

utf=1/0

[fonts]

fchannel=Tahoma,412,0,2

fquery=Tahoma,412,0,0

f##mircboard=Tahoma,412,0,2

Bei den Fonts ist immer der hinterste Teil wichtig.

Ihr könnt beispielsweise folgendes Snippet verwenden, um den UTF8-Status schnell zu prüfen:

 

Code:

alias getutf.read {

if (!$1) {

return $readini(mirc.ini,language,utf)

}

else {

return $gettok($readini(mirc.ini,fonts,f $+ $1),4,44)

}

}

alias getutf {

var %target = $iif($1 ischan,channel,$iif($chr(61) == $left($1,1),dcc,query))

var %a = $thm.getutf.read, %b = $thm.getutf.read(%target), %c = $thm.getutf.read($active)

if (%a == 1) || (%c isnum 1-2) || (%c != $chr(48) && %b isnum 1-2) { return $true }

else { return $false }

}

Hiermit könnt ihr mit $getutf($active) schnell und einfach überprüfen, ob mIRC im aktuellen Fenster UTF8 lesen kann oder nicht.

Falls ihr störende Sonderzeichen in euren Themes verwenden möchtet, solltet ihr also immer $getutf und $isutf prüfen lassen, ob diese nicht bearbeitet werden sollten.

Ich bitte alle Scripter, die das hier lesen, eine solche Prüfung in ihren Scripts umzusetzen, um mir und dem Rest der Unicode-Welt unser Leben etwas zu erleichtern.

 

Ein kleines Beispiel, wie ich es bei mir gelöst habe:

 

Code:

on &^*:text:*:#: {

if ($thm.getutf($active)) { var %getutf = 1 }

if ($highlight == $true) && ($highlight($1-)) && ($1- !isnum) {

var %t = 04 $+ $iif(%getutf == 1 && $isutf($nick $1-) == 2,•,•) $+

}

else {

var %t = $iif(%getutf == 1 && $isutf($nick $1-) == 2,  , )

}

echo -i5tlbfmc normal $chan %t $thm.nick($nick,$chan) $1-

haltdef

}

 

Übrigens - $chr(160), das viele gern als Fake-Leerzeichen in ihren Themes verwenden, ist auch so ein Störfaktor.

 

Schlusswort

 

Das wars erstmal wieder...

Ich hoffe, ich habe alles verständlich rübergebracht und zu dieser späten Stunde keine Fehler mehr eingebaut. (Gott! Schon wieder halb 4...)

Falls jemand noch Fragen hat, nur raus damit, das hier ist ein Forum!

Einige Kommentare dazu wären auch nicht schlecht, rührt euch... immerhin ist das ein komplizierteres Thema, da ist es wichtig, dass alles möglichst klar ist.

Rührt euch!

Ansonsten: Vielen Dank fürs Durchlesen!

 

http://www.mircboard.de/viewtopic.php?f ... 0647e524ca

Link to comment
Share on other sites



×
×
  • Create New...