From 5ea19f7db68e18155d67f0cbade1443b53af393c Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Sun, 19 Feb 2006 10:38:36 +0000 Subject: [PATCH] =?UTF-8?q?correction=20(et=20acc=C3=A9l=C3=A9ration)=20de?= =?UTF-8?q?=20l'import=20du=20charset=20pour=20ne=20plus=20transcoder=20le?= =?UTF-8?q?s=20entites=20<=20128=20(car=20si=20elles=20sont=20cod=C3=A9es?= =?UTF-8?q?=20ainsi,=20c'est=20=C3=A0=20dessein).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ce qui permet de retranscoder les squelettes au passage correction d'un bug dans le panneau de login lorsqu'on est déjà connecté (plantait sur http_href() non définie) --- ecrire/inc_charsets.php | 42 +++++++++++++++++++++++-------- formulaires/inc-login_public.php3 | 1 + inc-compilo.php3 | 2 +- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/ecrire/inc_charsets.php b/ecrire/inc_charsets.php index 420cca9e7b..259f28ed19 100644 --- a/ecrire/inc_charsets.php +++ b/ecrire/inc_charsets.php @@ -244,7 +244,8 @@ function charset2unicode($texte, $charset='AUTO' /* $forcer: obsolete*/) { // // Transforme les entites unicode  dans le charset specifie -// +// Attention on ne transforme pas les entites < € car si elles +// ont ete encodees ainsi c'est a dessein function unicode2charset($texte, $charset='AUTO') { static $CHARSET_REVERSE; if ($charset == 'AUTO') @@ -265,19 +266,22 @@ function unicode2charset($texte, $charset='AUTO') { $trans = array(); // Construire la table de remplacements // 1. Entites decimales (type "{") - if (preg_match_all(',&#([0-9]+);,', $texte, $regs, PREG_PATTERN_ORDER)) { + if (preg_match_all(',&#(0*[1-9][0-9][0-9]+);,', + $texte, $regs, PREG_PATTERN_ORDER)) { $entites = array_flip($regs[1]); foreach ($entites as $e => $v) { - if ($s = ($e < 128) ? $e : $CHARSET_REVERSE[$charset][intval($e)]) + if (intval($e)>127 + AND $s = $CHARSET_REVERSE[$charset][intval($e)]) $trans['&#'.$e.';'] = chr($s); } } - // 2. Entites hexadecimales (type "
") - if (preg_match_all(',&#x([0-9a-zA-Z]+);,', $texte, $regs, PREG_PATTERN_ORDER)) { + // 2. Entites hexadecimales (type "ഊ") + if (preg_match_all(',&#x(0*[1-9a-f][0-9a-f][0-9a-f]+);,i', + $texte, $regs, PREG_PATTERN_ORDER)) { $entites = array_flip($regs[1]); foreach ($entites as $e => $v) { $h = hexdec($e); - if ($s = ($h < 128) ? $h : $CHARSET_REVERSE[$charset][$h]) + if ($s = $CHARSET_REVERSE[$charset][$h]) $trans['&#x'.$e.';'] = chr($s); } } @@ -425,10 +429,28 @@ function caractere_utf_8($num) { } function unicode_to_utf_8($texte) { - while (preg_match(',�*([0-9]+);,', $texte, $regs)) { - $s = caractere_utf_8($regs[1]); - $texte = str_replace($regs[0], $s, $texte); + $vu = array(); + + // 1. Entites € et suivantes + if (preg_match_all(',�*([1-9][0-9][0-9]+);,', + $texte, $regs, PREG_SET_ORDER)) + foreach ($regs as $reg) { + if ($reg[1]>127 AND !$vu[$reg[0]]++) { + $s = caractere_utf_8($reg[1]); + $texte = str_replace($reg[0], $s, $texte); + } } + + // 2. Entites > ÿ + if (preg_match_all(',�*([1-9a-f][0-9a-f][0-9a-f]+);,i', + $texte, $regs, PREG_SET_ORDER)) + foreach ($regs as $reg) { + if (!$vu[$reg[0]]++) { + $s = caractere_utf_8(hexdec($reg[1])); + $texte = str_replace($reg[0], $s, $texte); + } + } + return $texte; } @@ -524,7 +546,7 @@ function is_utf8($string) { function is_ascii($string) { return !strlen( preg_replace( - ',[\x20-\x7E],s', + ',[\x09\x0A\x0D\x20-\x7E],s', '', $string)); } diff --git a/formulaires/inc-login_public.php3 b/formulaires/inc-login_public.php3 index 4cc866e86e..531d693a18 100644 --- a/formulaires/inc-login_public.php3 +++ b/formulaires/inc-login_public.php3 @@ -68,6 +68,7 @@ function login_explicite($login, $cible) { if (($cible != $action) && !headers_sent() AND !$_GET['var_mode']) redirige_par_entete($cible); + include_ecrire('inc_minipres'); return http_href($cible, _T('login_par_ici')); } return login_pour_tous($login ? $login : _request('var_login'), $cible, $action); diff --git a/inc-compilo.php3 b/inc-compilo.php3 index 1489b3a60a..9e8e3dd037 100644 --- a/inc-compilo.php3 +++ b/inc-compilo.php3 @@ -573,7 +573,7 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { // Pre-traitement : reperer le charset du squelette, et le convertir // Bonus : supprime le BOM include_ecrire('inc_charsets'); -# $squelette = transcoder_page($squelette); + $squelette = transcoder_page($squelette); // Phraser le squelette, selon sa grammaire // pour le moment: "html" seul connu (HTML+balises BOUCLE) -- GitLab