1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21829 -->
4 <sect1 id="zend.search.lucene.charset">
5 <title>Jeu de caractères</title>
7 <sect2 id="zend.search.lucene.charset.description">
8 <title>Support UTF-8 et caractères sur un octet</title>
11 <classname>Zend_Search_Lucene</classname> utilise l'UTF-8 en interne. Les fichiers
12 d'index stockent des données Unicode dans le "format UTF-8 modifié" de Java.
13 <classname>Zend_Search_Lucene</classname> supporte totalement ce format, à une exception
16 Zend_Search_Lucene supporte seulement les caractères Basic Multilingual
17 Plane (BMP) (de 0x0000 à 0xFFFF) et ne supporte pas les "caractères
18 supplémentaires" (caractères dont les codes sont supérieurs à 0xFFFF).
22 Java 2 représente ces caractères comme une paire de char (16-bit), le
23 premier depuis l'échelle haute (0xD800-0xDBFF), le second pour l'échelle basse
24 (0xDC00-0xDFFF). Ils sont alors encodés comme des caractères UTF-8 standards sur
25 six octets. La représentation UTF-8 standard utilise elle 4 octets pour les
26 caractères supplémentaires.
32 L'encodage des caractères d'entrée peut être spécifié grâce à l'API de
33 <classname>Zend_Search_Lucene</classname>. Les données seront converties automatiquement
38 <sect2 id="zend.search.lucene.charset.default_analyzer">
39 <title>Analyseur de texte par défaut</title>
42 Cependant, l'analyseur de texte par défaut (aussi utilisé par l'analyseur de
43 requête) utilise <methodname>ctype_alpha()</methodname>.
47 <methodname>ctype_alpha()</methodname> n'est pas compatible UTF-8, donc l'analyseur convertit
48 le texte vers "ASCII//TRANSLIT" avant l'indexation. Le même processus est utilisé de
49 manière transparente lors du requêtage. <footnote>
51 La conversion vers 'ASCII//TRANSLIT' peut dépendre de la locale courante
61 L'analyseur par défaut isole les chiffres. Utilisez le parseur "Num" si vous
62 voulez que les chiffres soient considérés comme des mots.
67 <sect2 id="zend.search.lucene.charset.utf_analyzer">
68 <title>Analyseurs de texte compatibles UTF-8</title>
71 <classname>Zend_Search_Lucene</classname> contient aussi des analyseurs
73 <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8</classname>,
74 <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num</classname>,
75 <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive</classname>,
76 <classname>Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive</classname>.
80 N'importe quel analyseur peut être activé avec un code comme celui-ci:
81 <programlisting language="php"><![CDATA[
82 Zend_Search_Lucene_Analysis_Analyzer::setDefault(
83 new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
91 Les analyseurs UTF-8 ont été améliorés dans Zend Framework 1.5. Les anciennes
92 versions considéraient les caractères non-ASCII comme des lettres. Les nouveaux
93 analyseurs sont quant à eux plus précis sur ce point.
97 Ceci pourrait vous obliger à reconstruire votre index afin que vos données et
98 vos requêtes de recherche soient au même format. Des résultats faux peuvent
104 Tous ces analyseurs nécessitent que la libraire PCRE (Perl-compatible regular
105 expressions) soit compilée avec le support d'UTF-8. Ce support d'UTF-8 pour PCRE est
106 activé par défaut dans les sources des libraires PCRE livrées avec <acronym>PHP</acronym>, mais si vous
107 avez utilisé des librairies partagées pour la compilation de <acronym>PHP</acronym>, alors le support
108 d'UTF-8 peut dépendre de l'OS.
112 Utilisez ce code pour vérifier si le support d'UTF-8 est assuré pour PCRE :
113 <programlisting language="php"><![CDATA[
114 if (@preg_match('/\pL/u', 'a') == 1) {
115 echo "support UTF-8 pour PCRE activé.\n";
117 echo "support UTF-8 pour PCRE désactivé.\n";
119 ]]></programlisting></para>
122 Les analyseurs UTF-8 insensibles à la casse ont aussi besoin de l'extension <ulink
123 url="http://www.php.net/manual/en/ref.mbstring.php">mbstring</ulink> pour être
128 Si vous voulez les analyseurs UTF-8 insensibles à la casse, mais que vous n'avez
129 pas mbstring, normalisez alors vos données avant de les indexer ainsi que vos requêtes
130 avant vos recherches, ceci en les tranformant en casse minuscule : <programlisting
133 setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
137 Zend_Search_Lucene_Analysis_Analyzer::setDefault(
138 new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
142 $doc = new Zend_Search_Lucene_Document();
144 $doc->addField(Zend_Search_Lucene_Field::UnStored(
145 'contents', strtolower($contents))
148 // champ titre (indexed, unstored)
149 $doc->addField(Zend_Search_Lucene_Field::UnStored(
150 'title', strtolower($title))
153 // champ titre (unindexed, stored)
154 $doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));
155 ]]></programlisting> <programlisting language="php"><![CDATA[
157 setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
161 Zend_Search_Lucene_Analysis_Analyzer::setDefault(
162 new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
166 $hits = $index->find(strtolower($query));
167 ]]></programlisting></para>