Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


Liste der Sonderzeichen selbst erstellen

Was ich in der Praxis oft benötige, ist ein schneller Überblick, hinter welcher Codenummer sich welches Zeichen verbirgt.

Statt sich durch endlose Dokumentationen zu quälen (ohne deren Relevanz in Frage zu stellen), bevorzuge ich, mir eine Liste aller Zeichen durch ein Programm generieren zu lassen.

Ein solches Programm, das eine Anzahl Codenummern in eine HTML- bzw. XML-Datei schreibt, die anschließend in einem Browser angezeigt werden kann, ist auch mit XSLT 2.0 problemlos möglich.

Den einfachsten Ansatz liefert das folgende Codebeispiel:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:result-document href="C:/wg/zeichensaetze.xml">
      <root>
        <xsl:for-each select="48 to 57">
          <z>
            <nr>
              <xsl:value-of select="."/>
            </nr>
            <zeichen>
              <xsl:text disable-output-escaping="yes">&amp;#</xsl:text>
              <xsl:value-of select="fn:concat(., ';')"/>
            </zeichen>
          </z>
        </xsl:for-each>
      </root>
    </xsl:result-document>
  </xsl:template>
</xsl:stylesheet>

Die vorstehende Logik kann mit einem beliebigen XML Input Dokument einfach aufgerufen werden, lediglich ein XSL 2.0-fähiger Prozessor ist erforderlich. Das Ergebnis ist ein Überblick über die codepoints 49 bis 57, die die Zahlenwerte von 0 bis 9 darstellen.

<root>
  <z><nr>48</nr><zeichen>&#48;</zeichen></z>
  <z><nr>49</nr><zeichen>&#49;</zeichen></z>
  <z><nr>50</nr><zeichen>&#50;</zeichen></z>
  <z><nr>51</nr><zeichen>&#51;</zeichen></z>
  <z><nr>52</nr><zeichen>&#52;</zeichen></z>
  <z><nr>53</nr><zeichen>&#53;</zeichen></z>
  <z><nr>54</nr><zeichen>&#54;</zeichen></z>
  <z><nr>55</nr><zeichen>&#55;</zeichen></z>
  <z><nr>56</nr><zeichen>&#56;</zeichen></z>
  <z><nr>57</nr><zeichen>&#57;</zeichen></z>
</root>

Das Ergebnis sieh im Browser so aus:

pic/codepoints.jpg

Es ist damit ein Leichtes, alle Zeichen von sagen wir 33 bis 50000 darzustellen (es gibt noch weit mehr), Sie müssen hierfür lediglich die Sequence anpassen:

<xsl:for-each select="33 to 50000">
...
</xsl:for-each>

Wundern Sie sich jedoch bitte nicht, wenn das Ergebnisdokument etwas umfangreicher wird, so daß Ihr verwendeter Browser etwas Zeit braucht, um alle Zeichen darzustellen.

Das vorstehende Template arbeitet mit <xsl:text disable-output-escaping="yes">&#</xsl:text>. Einen alternativen Ansatz bietet die spezielle String-Funktion "codepoints-to-string":

 <xsl:template name="LoopZeichensaetze">
  <root xmlns="www.wilfried-grupe.de/Zeichensaetze.xsl">
   <xsl:for-each select="32 to 55294">
    <zeichen nr="&amp;#{format-number(., '00000')};">
     <xsl:value-of select="codepoints-to-string(.)"/>
    </zeichen>
   </xsl:for-each>
  </root>
 </xsl:template>

Vergleichen Sie hierzu auch meine Anmerkungen über die String-Funktionen

Wenn Sie es etwas komplexer mögen: das Template "Zeichensaetze_HTML" generiert eine solche Liste für HTML. Bitte beachten Sie, daß die unterschiedlichen Browser diverse Zeichen unterschiedlich darstellen können. Hinzu kommt, daß diverse Zeichen nicht dargestellt werden können.

<xsl:template name="Zeichensaetze_HTML">
 <xsl:result-document
  href="Zeichensaetze.html"
  method="html">
  <html>
   <head>
    <meta http-equiv="Content-Type" 
     content="text/html; charset=utf-8" />
   </head>
   <body>
    <h3>Zeichensätze</h3>
    <table border="1" width="100%">
     <xsl:for-each select="(40 to 55294)[. mod 10 = 0 ]">
      <tr>
       <xsl:variable name="vcurnumber" select="."/>
       <xsl:for-each select="-9 to 0">
        <xsl:variable name="vpos" select="."/>
        <td align="right">
         <xsl:text disable-output-escaping="no">&amp;#</xsl:text>
         <xsl:value-of 
           select="format-number($vcurnumber + $vpos, '00000')" />
         <xsl:text>;</xsl:text>
        </td>
        <td align="center" bgcolor="lightgrey">
         <xsl:text disable-output-escaping="yes">&amp;#</xsl:text>
         <xsl:value-of 
           select="format-number($vcurnumber + $vpos, '00000')" />
         <xsl:text>;</xsl:text>
        </td>
       </xsl:for-each>
      </tr>
     </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:result-document>
</xsl:template>

Das zweite Template generiert gleich eine ganze Reihe einzelner XML-Dateien mit unterschiedlichen iso-8859-Encodings; für jedes werden die Zeichen von 32 bis 55294 generiert. Ich habe diesen Ansatz gewählt, um festzustellen, ob und inwieweit die Browser die Zeichen unterschiedlich darstellen.

 <xsl:template name="iso8859">
  <xsl:for-each select="1 to 9, 11, 13, 15">
   <xsl:variable name="vdateiname">
    <xsl:value-of
       select="concat('Zeichensaetze_iso8859_', ., '.xml')" />
   </xsl:variable>
   <xsl:variable name="vencoding">
    <xsl:value-of select="concat('iso-8859-', .)"></xsl:value-of>
   </xsl:variable>
   <xsl:result-document href="{$vdateiname}"
    encoding="{$vencoding}" indent="yes" 
    method="xml" omit-xml-declaration="no">
     <root xmlns="www.wilfried-grupe.de/Zeichensaetze.xsl">
      <xsl:for-each select="32 to 55294">
       <zeichen nr="&amp;#{format-number(., '00000')};">
       <xsl:text disable-output-escaping="yes">&amp;#</xsl:text>
        <xsl:value-of select="format-number(., '00000')" />
        <xsl:text>;</xsl:text>
       </zeichen>
      </xsl:for-each>
     </root>
   </xsl:result-document>
   <xsl:message>geschrieben: 
     <xsl:value-of select="$vdateiname"/></xsl:message>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

Das dritte Template "generateutf" versucht denselben Ansatz für UTF8 und UTF16. Dieses Template arbeitet mit der ausgelagerten Logik "LoopZeichensaetze".

<xsl:template name="generateutf">
  <xsl:result-document
   href="Zeichensaetze_utf8.xml"
   encoding="UTF-8" indent="yes" 
   method="xml" omit-xml-declaration="no">
   <xsl:call-template name="LoopZeichensaetze" />
  </xsl:result-document>
  <xsl:message>geschrieben: 
    Zeichensaetze_utf8.xml</xsl:message>
  <xsl:result-document
   href="Zeichensaetze_utf16.xml"
   encoding="UTF-16" indent="yes" 
    method="xml" omit-xml-declaration="no">
   <xsl:call-template name="LoopZeichensaetze" />
  </xsl:result-document>
  <xsl:message>geschrieben: 
   Zeichensaetze_utf16.xml
</xsl:message>
 </xsl:template>
</xsl:stylesheet>

qrpic/Encoding1.jpg

wg / 30. September 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info10@wilfried-grupe.de