<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 17175 -->
<!-- Reviewed: no -->
<sect1 id="zend.search.lucene.charset">
    <title>Jeu de caractères</title>

    <sect2 id="zend.search.lucene.charset.description">
        <title>Support UTF-8 et caractères sur un octet</title>

        <para>
            <classname>Zend_Search_Lucene</classname> utilise l'UTF-8 en interne. Les fichiers
            d'index stockent des données Unicode dans le "format UTF-8 modifié" de Java.
            <classname>Zend_Search_Lucene</classname> supporte totalement ce format, à une exception
            près. <footnote>
                <para>
                    Zend_Search_Lucene supporte seulement les caractères Basic Multilingual
                    Plane (BMP) (de 0x0000 à 0xFFFF) et ne supporte pas les "caractères
                    supplémentaires" (caractères dont les codes sont supérieurs à 0xFFFF).
                </para>

                <para>
                    Java 2 représente ces caractères comme une paire de char (16-bit), le
                    premier depuis l'échelle haute (0xD800-0xDBFF), le second pour l'échelle basse
                    (0xDC00-0xDFFF). Ils sont alors encodés comme des caractères UTF-8 standards sur
                    six octets. La représentation UTF-8 standard utilise elle 4 octets pour les
                    caractères supplémentaires.
                </para>
                </footnote>
            </para>

        <para>
            L'encodage des caractères d'entrée peut être spécifié grâce à l'API de
            <classname>Zend_Search_Lucene</classname>. Les données seront converties automatiquement
            en UTF-8.
        </para>
    </sect2>

    <sect2 id="zend.search.lucene.charset.default_analyzer">
        <title>Analyseur de texte par défaut</title>

        <para>
            Cependant, l'analyseur de texte par défaut (aussi utilisé par l'analyseur de
            requête) utilise <methodname>ctype_alpha()</methodname>.
        </para>

        <para>
            <methodname>ctype_alpha()</methodname> n'est pas compatible UTF-8, donc l'analyseur convertit
            le texte vers "ASCII//TRANSLIT" avant l'indexation. Le même processus est utilisé de
            manière transparente lors du requêtage. <footnote>
                <para>
                    La conversion vers 'ASCII//TRANSLIT' peut dépendre de la locale courante
                    ou de l'OS.
                </para>
                </footnote>
            </para>

        <note>
            <title></title>

            <para>
                L'analyseur par défaut isole les chiffres. Utilisez le parseur "Num" si vous
                voulez que les chiffres soient considérés comme des mots.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.search.lucene.charset.utf_analyzer">
        <title>Analyseurs de texte compatibles UTF-8</title>

        <para>
            <classname>Zend_Search_Lucene</classname> contient aussi des analyseurs
            compatibles UTF-8 :
            <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>
            N'importe quel analyseur peut être activé avec un code comme celui-ci:
            <programlisting language="php"><![CDATA[
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
]]></programlisting>
            </para>

        <warning>
            <title></title>

            <para>
                Les analyseurs UTF-8 ont été améliorés dans Zend Framework 1.5. Les anciennes
                versions considéraient les caractères non-ASCII comme des lettres. Les nouveaux
                analyseurs sont quant à eux plus précis sur ce point.
            </para>

            <para>
                Ceci pourrait vous obliger à reconstruire votre index afin que vos données et
                vos requêtes de recherche soient au même format. Des résultats faux peuvent
                apparaître sinon.
            </para>
        </warning>

        <para>
            Tous ces analyseurs nécessitent que la libraire PCRE (Perl-compatible regular
            expressions) soit compilée avec le support d'UTF-8. Ce support d'UTF-8 pour PCRE est
            activé par défaut dans les sources des libraires PCRE livrées avec <acronym>PHP</acronym>, mais si vous
            avez utilisé des librairies partagées pour la compilation de <acronym>PHP</acronym>, alors le support
            d'UTF-8 peut dépendre de l'OS.
        </para>

        <para>
            Utilisez ce code pour vérifier si le support d'UTF-8 est assuré pour PCRE :
            <programlisting language="php"><![CDATA[
if (@preg_match('/\pL/u', 'a') == 1) {
    echo "support UTF-8 pour PCRE activé.\n";
} else {
    echo "support UTF-8 pour PCRE désactivé.\n";
}
]]></programlisting></para>

        <para>
            Les analyseurs UTF-8 insensibles à la casse ont aussi besoin de l'extension <ulink
            url="http://www.php.net/manual/en/ref.mbstring.php">mbstring</ulink> pour être
            activés.
        </para>

        <para>
            Si vous voulez les analyseurs UTF-8 insensibles à la casse, mais que vous n'avez
            pas mbstring, normalisez alors vos données avant de les indexer ainsi que vos requêtes
            avant vos recherches, ceci en les tranformant en casse minuscule : <programlisting
            role="php"><![CDATA[
// Indexation
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))
              );

// champ titre (indexed, unstored)
$doc->addField(Zend_Search_Lucene_Field::UnStored(
                    'title', strtolower($title))
              );

// champ titre (unindexed, stored)
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
]]></programlisting> <programlisting language="php"><![CDATA[
// Recherche
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>