<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 15617 -->
<!-- Reviewed: no -->
<sect1 id="zend.search.lucene.charset">
    <title>Zeichensätze</title>

    <sect2 id="zend.search.lucene.charset.description">
        <title>Unterstützung für UTF-8 und Einzel-Byte Zeichensätze</title>

        <para>
            <classname>Zend_Search_Lucene</classname> arbeitet intern mit dem UTF-8 Zeichensatz.
            Indexdateien speichern Unicode Daten in Java's "modifiziertem UTF-8 Codierung". Der Kern
            von <classname>Zend_Search_Lucene</classname> unterstützt diesen Zeichensatz mit einer
            Ausnahme komplett.
            <footnote>
               <para>
                   <classname>Zend_Search_Lucene</classname> unterstützt nur Basic Multilingual
                   Plane (BMP) Zeichen (von 0x0000 bis 0xFFFF) und unterstützt keine "zusätzlichen
                   Zeichen" (Zeichen deren Codepunkte größer als 0xFFFF sind).
               </para>
               <para>
                   Java 2 zeigt diese Werte als Paare von Zeichen (16-bit) Werten an, der erste vom
                   High-Surrogate Bereich (0xD800-0xDBFF), den zweiten vom Low-Surrogate Bereich
                   (0xDC00-0xDFFF). Dann werden Sie als normale UTF-8 Zeichen mit sechs Bytes
                   kodiert. Die Standard UTF-8 Repräsentation verwendet vier Bytes für zusätzliche
                   Zeichen.
               </para>
            </footnote>
        </para>

        <para>
            Die Codierung der aktuellen Eingabedaten dann über die API von
            <classname>Zend_Search_Lucene</classname> spezifiziert werden. Daten werden automatisch
            in die UTF-8 Codierung konvertiert.
        </para>
    </sect2>

    <sect2 id="zend.search.lucene.charset.default_analyzer">
        <title>Standard Textanalysator</title>
        <para>
            Trotzdem verwendet der standardmäßige Textanalysator (welche auch im Anfrageparser
            arbeitet) ctype_alpha() für das analysieren von Text und Anfragen.
        </para>

        <para>
            ctype_alpha() ist nicht UTf-8 kompatibel, weswegen der Analysator Text zuerst in die
            'ASCII//TRANSLIT' Codierung konvertiert bevor er indiziert. Die selbe Bearbeitung wird
            transparent wärend des Parsens der Abfrage durchgeführt
            <footnote>
               <para>
                   Konvertierungen in 'ASCII//TRANSLIT' sind abhängig von dem aktuellen
                   Gebietsschema und OS.
               </para>
            </footnote>
        </para>

        <note>
            <title/>
            <para>
                Der Standardanalysator behandelt Zahlen nicht als Teile von Ausdrücken. Wenn Wörter
                nicht durch Zahlen unterbrochen werden sollen kann der entsprechende 'Num'
                Analysator verwendet werden.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.search.lucene.charset.utf_analyzer">
        <title>UTF-8 kompatibler Textanalysator</title>

        <para>
            <classname>Zend_Search_Lucene</classname> enthält auch ein Set von UTF-8 kompatiblen
            Analysatoren: <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8</classname>,
            <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num</classname>,
            <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive</classname>,
            <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive</classname>.
        </para>

        <para>
            Jeder dieser Analysatoren kenn mit Code wie dem folgenden eingeschaltet werden:

            <programlisting language="php"><![CDATA[
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
]]></programlisting>
        </para>

        <warning>
            <title/>
            <para>
                Die UTF-8 kompatiblen Analysatoren wurden in ZF 1.5 verbessert. Frühere Versionen
                der Analysatoren nahmen an das alle nicht-Ascii Zeichen Buchstaben sind. Die neuen
                Analysatoren haben ein genaueres Verhalten.
            </para>
            <para>
                Deswegen kann es notwendig sein den Index neu zu erstellen um Daten und Suchanfragen
                auf die gleiche Art und Weise in Ausdrücke zerlegt zu haben, weil sonst andererseits
                die Suchmaschine falsche Ergebnissets zurückgeben könnte.
            </para>
        </warning>

        <para>
            Alle diese Analysatoren benötigen die PCRE (Perl-kompatible reguläre Ausdrücke)
            Bibliothek kompiliert mit eingeschalteter UTF-8 Unterstützung. PCRE UTF-8 Unterstützung
            ist für die PCRE Bibliotheks Quellcodes die mit den PHP Quellcodes gekoppelt sind,
            eingeschaltet, aber wenn eine andere Bibliothek als die vom PHP Quellcode verwendet
            wird, ist der Status der UTF-8 Unterstützung abhängig vom eigenen Betriebsystem.
        </para>

        <para>
            Der folgende Code kann verwendet werden um zu prüfen ob PCRE UTF-8 Unterstützung
            eingeschaltet ist:

            <programlisting language="php"><![CDATA[
if (@preg_match('/\pL/u', 'a') == 1) {
    echo "PCRE Unicode Unterstützung ist eingeschaltet.\n";
} else {
    echo "PCRE Unicode Unterstützung ist ausgeschaltet.\n";
}
]]></programlisting>
        </para>

        <para>
            Groß-/Kleinschreibungs-unabhängige Versionen von UTF-8 kompatiblen Analysatoren
            erfordern das die <ulink
                 url="http://www.php.net/manual/en/ref.mbstring.php">mbstring</ulink> Erweiterung
            aktiviert ist.
        </para>

        <para>
            Wenn man die mbstring Erweiterung nicht einschalten will, und trotzdem
            Groß-/Kleinschreibungs unabhängige Suchen benötigt, kann die folgende Vorgehensweise
            verwendet werden: Quelldaten vor der Indizierung und Abfragestring for der Suche
            normalisieren indem diese zur Kleinschreibung konvertiert werden:

            <programlisting language="php"><![CDATA[
// Indizierung
setlocale(LC_CTYPE, 'de_DE.iso-8859-1');

...

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());

...

$doc = new Zend_Search_Lucene_Document();

$doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
                                                  strtolower($contents)));

// Titel Feld für das Durchsuchen (indiziert, nicht gespeichert)
$doc->addField(Zend_Search_Lucene_Field::UnStored('title',
                                                  strtolower($title)));

// Titel Feld für das Empfangen (nicht indiziert, gespeichert)
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
]]></programlisting>

            <programlisting language="php"><![CDATA[
// Suche
setlocale(LC_CTYPE, 'de_DE.iso-8859-1');

...

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());

...

$hits = $index->find(strtolower($query));
]]></programlisting>
        </para>
    </sect2>
</sect1>