Re: Deutsche Umlaute kodieren

"Josef 'Jupp' Schugt" <[email protected]> Mon, 21 Jun 2004 12:18:52 +0200
Newsgroups gmane.comp.lang.ruby.german
Organization Cologne Area Ruby Evangelization Project
Message-ID <[email protected]>
Dirk Einecke wrote:
> s = 'üöäß'
> s = CGI::escapeHTML(s)
> puts s # -> üöäß
>        # -> brauchen würde ich aber &uuml;&ouml;&auml;&szlig;

Warum willst du diese Entitys verwenden?
Wenn die Seite im Header

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">

enthält, kannst du problemlos Latin-1 verwenden. Solltest du lieber 
Latin-9 nehmen, musst du iso-8859-1 durch iso-8859-15 ersetzen.

Latin-1 ist ganz einfach, dafür kannst du die nummerischen Entitys 
verwenden; die Konvertierung sieht so aus:

text = CGI::escapeHTML(text).gsub(/./){|char|
   code = char[0]
   code > 127 ? "&##{code};" : char
}

Latin-9 ist etwas komplizierter, geht aber auch noch einigermaßen:

text = "\xa4\xa6\xa8\xb4\xb8\xbc\xbd\xbe"

text = CGI::escapeHTML(text).gsub(/./) { |char|
   code = char[0]
   case code
     when 0 .. 127 then char
     when      164 then "&#8364;"
     when      166 then "&#352;"
     when      168 then "&#353;"
     when      180 then "&#381;"
     when      184 then "&#382;"
     when      188 then "&#338;"
     when      189 then "&#339;"
     when      190 then "&#376;"
     else               "&##{code};"
   end
}

Dabei habe ich jetzt den Beispieltext mit den Zeichen belegt, in 
denen sich Latin-9 und Latin-1 unterscheiden.

Wenn du nach anderen Zeichensätzen suchen solltest:

http://dwd.da.ru/charsets/

Der obige Ansatz mit den drei Fällen

- 0..127 (das ist ASCII)
- einzelne Codes (Unterschiede zu Latin-1)
- andernfalls (Nicht-ASCII aber identisch zu Latin-1)

funktioniert für alle gängigen ISO-8859-Zeichensätze (sofern sie 
überhaupt für lateinische Schriften gedacht sind).

Josef 'Jupp' Schugt