OVH Cloud OVH Cloud

Detecter le type d'une chaine

4 réponses
Avatar
Benoît
Bonjour,

Je cherche à detecter le type d'encodage d'un fichier html
($monFichier).
$ma_chaine = file_get_contents($monFichier);

1ère solution : récupérer le charset dans la balise <meta> du
fichier -> pose un problème car Internet Explorer inscrit ISO-8859-1
même s'il a été enregistré en Unicode(UTF-16).

2ème solution : utiliser un algorithme plus ou moins complexe qui
permet de détecter l'encodage avec lequel a été créer le fichier.
Le w3 propose une fonction qui détecte le format utf-8 :
<?php

// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {

// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);

} // function is_utf8

?>

J'en voudrais une qui détecte le format UTF-16!Existe-elle?
mb_detect_encoding($ma_chaine,"UTF-16") de php ne fonctionne pas avec
ce format.

L'idéal serait de pouvoir détecter l'encodage peut importe le
navigateur et sa version.

Merci pour votre aide.

4 réponses

Avatar
Olivier Miakinen

// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {

// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[x09x0Ax0Dx20-x7E] # ASCII
| [xC2-xDF][x80-xBF] # non-overlong 2-byte
| xE0[xA0-xBF][x80-xBF] # excluding overlongs
| [xE1-xECxEExEF][x80-xBF]{2} # straight 3-byte
| xED[x80-x9F][x80-xBF] # excluding surrogates
| xF0[x90-xBF][x80-xBF]{2} # planes 1-3
| [xF1-xF3][x80-xBF]{3} # planes 4-15
| xF4[x80-x8F][x80-xBF]{2} # plane 16
)*$%xs', $string);

} // function is_utf8


Sympa, cette fonction.

J'en voudrais une qui détecte le format UTF-16!Existe-elle?


Si j'ai bien compris, le format UTF-16 consiste tout simplement à mettre
les deux octets de chaque caractère Unicode (ceux inférieurs à 65536) en
séquence, avec une convention particulière pour les plus grands.

Par conséquent, à moins qu'il ne commence par un « Byte Order Mark »
(BOM), sans précision sur la langue utilisée il est difficile voire
impossible de le dire. Cela dit, si le texte est un un fichier HTML,
c'est plus facile car tout le début est de l'ASCII 7bits.

À priori, un fichier UTF-16, selon qu'il a un BOM ou non, et selon qu'il
est Big Endian ou Little Endian, commence comme ceci (## représente un
caractère undéterminé, compris entre 20 et 7E) :

UTF-16 BE avec BOM : FE FF 00 ## 00 ## 00 ## ...
UTF-16 BE sans BOM : 00 ## 00 ## 00 ## 00 ## ...

UTF-16 LE avec BOM : FF FE ## 00 ## 00 ## 00 ...
UTF-16 LE sans BOM : ## 00 ## 00 ## 00 ## 00 ...

Voir aussi ceci pour des fichiers XML :
<http://www.w3.org/TR/2004/REC-xml-20040204/#sec-guessing>.

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.

Avatar
Guillaume Bouchard
Benoît wrote:
Bonjour,


Bonjour.

1ère solution : récupérer le charset dans la balise <meta> du
fichier -> pose un problème car Internet Explorer inscrit ISO-8859-1
même s'il a été enregistré en Unicode(UTF-16).


Rien compris. tu ouvres ta page avec file_get_contents, je ne vois pas
où IE intervient ici...
Après si quand tu veux sauvegarder une page sur ton disque et que
lorsque tu fait cela, IE à la bonne idee de changer la balise meta pour
son propre plaisir, c'est con... :( (Change de navigateur :))


Maitenant j'aimerais juste corriger un abut de langague non grave ici
mais qui est interessant de savoir. Unicode n'est en rien utf-16...

Unicode c'est la vue de l'esprit qui represente les caractères.

Utf-8/16/ascii/iso-8859-1 sont des encodages qui esseye de representer
les caractères.

Pour paralleliser. Quand tu comptes. le nombre sept n'est qu'une vu de
l'esprit qui represente 7 élements. Ce sept est universel, même les
kligons/martion/marklor utilise le sept, c'est l'unicode.

Maitenant "sept",7, 111 (Binaire) 10 (base 7), VII (romain),rwx (7 en
unixien) c'est la façon de representer ton sept et cela c'est les
encodages (utf-8/16, ascii, ce que tu veux)


2ème solution : utiliser un algorithme plus ou moins complexe qui
permet de détecter l'encodage avec lequel a été créer le fichier.


Plus ou moins complexe et totalement non certain comme je te le disait
dans mon autre mail. Si les encodages pouvaient se reconaitre, on ne
prendrait pas la peine de les indiquer dans les entetes... Tu auras donc
des résultats justes et d'autre totalement erronés.

L'idéal serait de pouvoir détecter l'encodage peut importe le
navigateur et sa version.


Mais je comprend pas là. Tu fais du php, il n'y a aucun navigateur dans
l'histoire...

Merci pour votre aide.


De rien, j'apporte des questions en plus sans réponses...

--
Guillaume.

Avatar
loufoque
Olivier Miakinen a dit le 26/07/2005 à 12:01:

À priori, un fichier UTF-16, selon qu'il a un BOM ou non


Normalement un fichier UTF-16 doit avoir un BOM.

Avatar
loufoque
Benoît a dit le 26/07/2005 à 01:22:

Je cherche à detecter le type d'encodage d'un fichier html


La détection d'encodage, c'est mal.

($monFichier).
$ma_chaine = file_get_contents($monFichier);

1ère solution : récupérer le charset dans la balise <meta> du
fichier -> pose un problème car Internet Explorer inscrit ISO-8859-1
même s'il a été enregistré en Unicode(UTF-16).


Tu dois te tenir à la déclaration.
Si celle-ci est erronée, c'est la faute du document, pas la tienne.