Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Correction des apostrophes

16 réponses
Avatar
Denis Beauregard
Bonjour,

Quelqu'un a saisi un certain texte dans un fichier word, puis recopier
ces lignes dans une base mySQL. word a le défaut de transformer les
apostrophes en un caractère reconnu par word seulement.

Y a-t-il une méthode simple pour corriger ces apostrophes ?

Présentement, j'ai un htmlentities qui transforme les accents en
entités (la base mySQL est en latin-1 et tout le texte de la page
html que j'ai transformée en PHP est en UTF8). Y a-t-il une
fonction similaire pour les apostrophes ? Je suis certain que celui
qui saisit ce texte va introduire d'autres apostrophes et je pense
qu'il est plus simple de corriger au moment de l'affichage.


Denis

10 réponses

1 2
Avatar
CrazyCat
Denis Beauregard wrote:
Bonjour,

Quelqu'un a saisi un certain texte dans un fichier word, puis recopier
ces lignes dans une base mySQL. word a le défaut de transformer les
apostrophes en un caractère reconnu par word seulement.

Y a-t-il une méthode simple pour corriger ces apostrophes ?



J'utilise (avec plus ou moins de bon résultats) le système suivant:

<?php
$cp1252_map = array(
"xc2x80" => "xe2x82xac", /* EURO SIGN */
"xc2x82" => "xe2x80x9a", /* SINGLE LOW-9 QUOTATION MARK */
"xc2x83" => "xc6x92", /* LATIN SMALL LETTER F WITH HOOK */
"xc2x84" => "xe2x80x9e", /* DOUBLE LOW-9 QUOTATION MARK */
"xc2x85" => "xe2x80xa6", /* HORIZONTAL ELLIPSIS */
"xc2x86" => "xe2x80xa0", /* DAGGER */
"xc2x87" => "xe2x80xa1", /* DOUBLE DAGGER */
"xc2x88" => "xcbx86", /* MODIFIER LETTER CIRCUMFLEX ACCENT */
"xc2x89" => "xe2x80xb0", /* PER MILLE SIGN */
"xc2x8a" => "xc5xa0", /* LATIN CAPITAL LETTER S WITH CARON */
"xc2x8b" => "xe2x80xb9", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
"xc2x8c" => "xc5x92", /* LATIN CAPITAL LIGATURE OE */
"xc2x8e" => "xc5xbd", /* LATIN CAPITAL LETTER Z WITH CARON */
"xc2x91" => "xe2x80x98", /* LEFT SINGLE QUOTATION MARK */
"xc2x92" => "xe2x80x99", /* RIGHT SINGLE QUOTATION MARK */
"xc2x93" => "xe2x80x9c", /* LEFT DOUBLE QUOTATION MARK */
"xc2x94" => "xe2x80x9d", /* RIGHT DOUBLE QUOTATION MARK */
"xc2x95" => "xe2x80xa2", /* BULLET */
"xc2x96" => "xe2x80x93", /* EN DASH */
"xc2x97" => "xe2x80x94", /* EM DASH */
"xc2x98" => "xcbx9c", /* SMALL TILDE */
"xc2x99" => "xe2x84xa2", /* TRADE MARK SIGN */
"xc2x9a" => "xc5xa1", /* LATIN SMALL LETTER S WITH CARON */
"xc2x9b" => "xe2x80xba", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
"xc2x9c" => "xc5x93", /* LATIN SMALL LIGATURE OE */
"xc2x9e" => "xc5xbe", /* LATIN SMALL LETTER Z WITH CARON */
"xc2x9f" => "xc5xb8" /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);

/**
* Transforme une chaine cp1252 en utf8
* @param string $string Chaine à décoder
* @return string
*/
function cp1252_to_utf8($string) {
global $cp1252_map;
return strtr($str, $cp1252_map);
}

/**
* Décode une chaine Word déjà encodée en utf8
* @param string Chaine à décoder
* @return string
*/
function cp1252_utf8_to_iso($str) { // the other way around...
global $cp1252_map;
return utf8_decode(strtr($str, array_flip($cp1252_map)));
}
?>

Il faut tester l'une ou l'autre des fonctions, selon l'encodage des données.


--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Avatar
Olivier Miakinen
Le 07/05/2009 08:59, Denis Beauregard a écrit :

Quelqu'un a saisi un certain texte dans un fichier word, puis recopier
ces lignes dans une base mySQL. word a le défaut de transformer les
apostrophes en un caractère reconnu par word seulement.



Ce caractère est reconnu par d'autres logiciels que Word, même si c'est
dans un jeu de caractères propriétaire (CP1252 de Microsoft) :
<http://www.miakinen.net/vrac/charsets/?or=4&pr6>.

Y a-t-il une méthode simple pour corriger ces apostrophes ?

Présentement, j'ai un htmlentities qui transforme les accents en
entités (la base mySQL est en latin-1 et tout le texte de la page
html que j'ai transformée en PHP est en UTF8). Y a-t-il une
fonction similaire pour les apostrophes ?



Si je comprends bien, l'apostrophe cp1252 est déjà stockée dans la base
censée contenir de l'ISO-Latin1, et tu as configuré ton accès à cette
base de telle sorte que les caractères soient transformés en UTF-8 à la
lecture. C'est bien cela ?

Si oui, et si ta base mySQL l'autorise, alors le plus simple serait de
déclarer qu'elle contient du cp1252 plutôt que du latin1. Au passage, ça
te permettrait de gérer aussi les caractères « ¤ », « ½ », et ainsi de
suite (caractères des lignes 80 et 90 de la page citée plus haut).

Mais si l'accès à la base te retourne du latin1 et que tu le transformes
toi-même en UTF-8 par utf8_encode(), alors soit tu remplaces l'appel à
utf8_encode par un appel à iconv("CP1252", "UTF-8", ...), soit tu fais
d'abord un preg_replace("/x92/", "&rsquo;", ...) avant de convertir.

Si tu as besoin d'explications complémentaires, commence par en dire
plus sur le contexte : où est le caractère quand tu dois le traiter,
quels sont les paramètres d'accès à MySQL, quel est le charset de
sauvegarde de ton code PHP, etc.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 07/05/2009 17:18, CrazyCat répondait à Denis Beauregard :

<?php
$cp1252_map = array(
"xc2x80" => "xe2x82xac", /* EURO SIGN */
[...]
"xc2x94" => "xe2x80x9d", /* RIGHT DOUBLE QUOTATION MARK */
[...]
"xc2x9f" => "xc5xb8" /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);



Ah oui, pas bête. Là on remplace le caractère erroné *après* traduction
en UTF-8.
Avatar
Denis Beauregard
Le 07 May 2009 15:18:55 GMT, Olivier Miakinen <om+
écrivait dans fr.comp.lang.php:

Le 07/05/2009 08:59, Denis Beauregard a écrit :

Quelqu'un a saisi un certain texte dans un fichier word, puis recopier
ces lignes dans une base mySQL. word a le défaut de transformer les
apostrophes en un caractère reconnu par word seulement.



Ce caractère est reconnu par d'autres logiciels que Word, même si c'est
dans un jeu de caractères propriétaire (CP1252 de Microsoft) :
<http://www.miakinen.net/vrac/charsets/?or=4&pr6>.



Le plus bête, c'est qu'avec mon PC avec Win 98, cela ne se rend pas
l'écran (il ne reste que des "?").

Y a-t-il une méthode simple pour corriger ces apostrophes ?

Présentement, j'ai un htmlentities qui transforme les accents en
entités (la base mySQL est en latin-1 et tout le texte de la page
html que j'ai transformée en PHP est en UTF8). Y a-t-il une
fonction similaire pour les apostrophes ?



Si je comprends bien, l'apostrophe cp1252 est déjà stockée dans la base
censée contenir de l'ISO-Latin1, et tu as configuré ton accès à cette
base de telle sorte que les caractères soient transformés en UTF-8 à la
lecture. C'est bien cela ?



Non, c'est transformé en entités, ce qui revient au même
é -> &eacute; par exemple

Si oui, et si ta base mySQL l'autorise, alors le plus simple serait de
déclarer qu'elle contient du cp1252 plutôt que du latin1. Au passage, ça
te permettrait de gérer aussi les caractères « ¤ », « ½ », et ainsi de
suite (caractères des lignes 80 et 90 de la page citée plus haut).



Je ne vois pas comment faire, donc je suppose que ce n'est pas permis.
En fait, je n'ai pas vu comment définir le jeu de caractères des
tables sur ce serveur (phpmyadmin 2.11.1.2) alors que sur un autre
serveur (phpmyadmin 2.11.9.4) c'est visible.

Mais si l'accès à la base te retourne du latin1 et que tu le transformes
toi-même en UTF-8 par utf8_encode(), alors soit tu remplaces l'appel à
utf8_encode par un appel à iconv("CP1252", "UTF-8", ...), soit tu fais
d'abord un preg_replace("/x92/", "&rsquo;", ...) avant de convertir.



le replace me semble plus simple en l'occurence. En tous cas, je
viens d'essayer et cela donne le résultat désiré ! Merci !

Mon problème était que j'ignorais le code de l'apostrophe et quand
je manipule, j'avais peur de changer ce code en autre chose (j'écris
le code PHP avec un éditeur DOS...)é

Si tu as besoin d'explications complémentaires, commence par en dire
plus sur le contexte : où est le caractère quand tu dois le traiter,
quels sont les paramètres d'accès à MySQL, quel est le charset de
sauvegarde de ton code PHP, etc.



Le problème en soi est résolu, mais pour compléter, si je peux dire:

- données originales dans un fichier Word en cp1252 et pas moyen de
changer (celui qui fait la saisie ne sait pas comment s'y prendre
et ne pose pas de question pour qu'on lui explique)
- base mysql en latin1 et pas moyen de changer
- code en PHP écrit d'abord avec un éditeur DOS et des entités, puis
modifié en fonction d'un exemple (fait par une 3e personne) fait en
UTF8.

Moi je dois tout intégrer...


Denis
Avatar
Denis Beauregard
Le 07 May 2009 15:18:55 GMT, CrazyCat écrivait
dans fr.comp.lang.php:

Denis Beauregard wrote:
Bonjour,

Quelqu'un a saisi un certain texte dans un fichier word, puis recopier
ces lignes dans une base mySQL. word a le défaut de transformer les
apostrophes en un caractère reconnu par word seulement.

Y a-t-il une méthode simple pour corriger ces apostrophes ?



J'utilise (avec plus ou moins de bon résultats) le système suivant:



Merci de l'idée. Je conserve en mémoire au cas où cela devient
nécessaire (avec un peu de chance, le saisisseur n'a pas utilisé
d'autres caractères non latin-1).


Denis
Avatar
Denis Beauregard
Le 07 May 2009 15:18:55 GMT, Olivier Miakinen <om+
écrivait dans fr.comp.lang.php:

Mais si l'accès à la base te retourne du latin1 et que tu le transformes
toi-même en UTF-8 par utf8_encode(), alors soit tu remplaces l'appel à
utf8_encode par un appel à iconv("CP1252", "UTF-8", ...), soit tu fais
d'abord un preg_replace("/x92/", "&rsquo;", ...) avant de convertir.



le preg_replace ne fonctionne pas.

Mon code, en gros

$l = mysql_fetch_array ($res);
$s = $ligne["champ"];
preg_replace("/x92/", "&rsquo;ZZZZZZ", $s);
echo $s;


J'ai ajouté le ZZZZZZ pour bien voir si cela fait quelque chose et
je ne vois rien.

Pourtant, si j'édite le champ avec phpmyadmin, l'apostrophe est bien
visible, donc elle est bien dans la base de données. C'est comme si
quelque chose remplaçait l'apostrophe cp1252 par un ? avant que je
puisse la changer à mon tour.

Je croyais que cela fonctionnait mais en fait, j'avais tellement
remplacé d'apostrophes à la main que ce que je regardais n'avait
pas cette apostrophe.


Denis
Avatar
Mickael Wolff
CrazyCat wrote:

Il faut tester l'une ou l'autre des fonctions, selon l'encodage des
données.



iconv devrait faire le boulot, non ?

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Olivier Miakinen
Le 08/05/2009 11:35, Denis Beauregard a écrit :

le preg_replace ne fonctionne pas.

Mon code, en gros

$l = mysql_fetch_array ($res);
$s = $ligne["champ"];
preg_replace("/x92/", "&rsquo;ZZZZZZ", $s);
echo $s;

J'ai ajouté le ZZZZZZ pour bien voir si cela fait quelque chose et
je ne vois rien.



Ça marcherait probablement mieux si tu mettais le résultat du
preg_replace dans $s. ;-)

$s = preg_replace("/x92/", "&rsquo;ZZZZZZ", $s);

Au fait, dans ce cas simple str_replace devrait suffire :

$s = str_replace("x92", "&rsquo;ZZZZZZ", $s);

Et si jamais ça ne marchais toujours pas, affiche donc bin2hex($s) pour
qu'on sache exactement ce qu'il contient.

Si 92 : c'est une apostrophe cp1252
Si E28099 : c'est une apostrophe UTF-8
Si C292 : c'était une apostrophe cp1252, traduite en UTF-8 comme s'il
s'agissait d'un code de commande Latin1
Avatar
Denis Beauregard
Le 08 May 2009 09:35:48 GMT, Denis Beauregard
écrivait dans
fr.comp.lang.php:

Le 07 May 2009 15:18:55 GMT, Olivier Miakinen <om+
écrivait dans fr.comp.lang.php:

Mais si l'accès à la base te retourne du latin1 et que tu le transformes
toi-même en UTF-8 par utf8_encode(), alors soit tu remplaces l'appel à
utf8_encode par un appel à iconv("CP1252", "UTF-8", ...), soit tu fais
d'abord un preg_replace("/x92/", "&rsquo;", ...) avant de convertir.



le preg_replace ne fonctionne pas.



honte sur moi !!!!!!!

J'ai écrit

preg_replace("/x92/", "&rsquo;", $s);

au lieu de

$s=preg_replace("/x92/", "&rsquo;", $s);


Denis
Avatar
Bernard
Bonjour,

"Olivier Miakinen" <om+ a écrit dans le message de
news:4a02ed0c$
Le 07/05/2009 08:59, Denis Beauregard a écrit :

Quelqu'un a saisi un certain texte dans un fichier word, puis recopier
ces lignes dans une base mySQL. word a le défaut de transformer les
apostrophes en un caractère reconnu par word seulement.






J'ai le même problème avec un copier/coller de Word ou Open Office dans un
champ de saisie

Ce caractère est reconnu par d'autres logiciels que Word, même si c'est
dans un jeu de caractères propriétaire (CP1252 de Microsoft) :
http://www.miakinen.net/vrac/charsets/?or=4&pr6.



Cette page est superbe !


Y a-t-il une méthode simple pour corriger ces apostrophes ?

Présentement, j'ai un htmlentities qui transforme les accents en
entités (la base mySQL est en latin-1 et tout le texte de la page
html que j'ai transformée en PHP est en UTF8). Y a-t-il une
fonction similaire pour les apostrophes ?






Je m'aperçois au fil de cette discussion que je dois avoir tout faux depuis
des années !!!
Mes méthodes de programmation ont été acquise il y a 40 ans et celles
d'internet il y a12 ans.
Il va donc falloir que je reprenne tous mes basiques à zéro,
en effet depuis que je programme en php/mySQL j'ai fait moyennement
attention
à toutes ces questions et j'ai paramétré mySQL au petit bonheur-la-chance
en tâtonnant pour voir quel était le meilleur résultat sur les apostrophes,
les euros,
le oe ae liés, etc.
Mes paramètres interclassement sont en général "latin_1_swedish_ci " chez
OVH
ou "latin_general_ci " chez online.
Ces hébergeurs n'ont pas l'option cp1252.

Mes prgramme php déclarent ceci :
<meta http-equiv="content-Type" content="text/html; charset=iso-8859-1">

Je me débrouille pour mettre des entités unicode quand il y a une
difficulté,
par exemple un unicode oe ou euro qui devient ? qaund on charge la base.

Mais je viens aussi de m'apercevoir que les requêtes de recherches par
mot-clés
ignoraient tous les caractères codés en unicode.

J'y perds mon latin (que je n'ai jamais appris!).

Y aurait-il des livres ou des sites où je pourrais, sans trop d'aspirine,
reprendre
tout cela à zéro ?

Merci beaucoup et bien cordialement,

Bernard




Si je comprends bien, l'apostrophe cp1252 est déjà stockée dans la base
censée contenir de l'ISO-Latin1, et tu as configuré ton accès à cette
base de telle sorte que les caractères soient transformés en UTF-8 à la
lecture. C'est bien cela ?

Si oui, et si ta base mySQL l'autorise, alors le plus simple serait de
déclarer qu'elle contient du cp1252 plutôt que du latin1. Au passage, ça
te permettrait de gérer aussi les caractères « ¤ », « ½ », et ainsi de
suite (caractères des lignes 80 et 90 de la page citée plus haut).

Mais si l'accès à la base te retourne du latin1 et que tu le transformes
toi-même en UTF-8 par utf8_encode(), alors soit tu remplaces l'appel à
utf8_encode par un appel à iconv("CP1252", "UTF-8", ...), soit tu fais
d'abord un preg_replace("/x92/", "&rsquo;", ...) avant de convertir.

Si tu as besoin d'explications complémentaires, commence par en dire
plus sur le contexte : où est le caractère quand tu dois le traiter,
quels sont les paramètres d'accès à MySQL, quel est le charset de
sauvegarde de ton code PHP, etc.

Cordialement,
--
Olivier Miakinen


1 2