Changement d'encodage

Eléphant du PHP | 60 Messages

12 févr. 2008, 14:44

Bonjour.
Je rencontre un problème avec l'encodage dans un script de lecture de fichier : mon script se trouve dans un fichier PHP encodé en utf8 avec (normalement) tout ce qu'il faut pour que l'utf8 soit imposé. Mon navigateur ouvre aussi par défaut les pages Web en utf8.
Le fichier que je tente de lire, lui, est encodé en "plain text" version Mac. L'encodage porte visiblement le nom de "Mac OS Roman".

Voici le script :
<?php
header('Content-type: text/html; charset=utf8');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title></title>
	</head>
	<body>
<?php
if (file_exists("Test.txt"))
	$Tab = file("Test.txt", FILE_IGNORE_NEW_LINES);
else
{
	echo "Fichier introuvable.";
	exit();
}

foreach($Tab as $Ligne)
	echo $Ligne."X<br />";
A l'affichage de chaque ligne, les lettres accentuées sont remplacées par un point d'interrogation dans un losange : �
J'ai essayé de forcer l'encodage de chaque ligne en utf8 avec la fonction utf8_encode() :
<?php
header('Content-type: text/html; charset=utf8');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title></title>
	</head>
	<body>
<?php
if (file_exists("Test.txt"))
	$Tab = file("Test.txt", FILE_USE_INCLUDE_PATH + FILE_IGNORE_NEW_LINES);
else
{
	echo "Fichier introuvable.";
	exit();
}

foreach($Tab as $Ligne)
	echo utf8_encode($Ligne)."X<br />";
Cette fois-ci, les caractères accentués n'apparaissent plus du tout.

Précision : le problème est le même si je lis le fichier avec fgets() plutôt qu'avec file().

Merci d'avance pour vos réponses.

Invité
Invité n'ayant pas de compte PHPfrance

12 févr. 2008, 14:49

peut etre avec son inverse

utf8_decode();
http://fr3.php.net/utf8_decode

Eléphant du PHP | 60 Messages

12 févr. 2008, 15:51

Non, utf8_decode() ne change rien. Ca m'aurait beaucoup étonné d'ailleurs.

Eléphant du PHP | 445 Messages

12 févr. 2008, 16:11

Essaie htmlentities() qui convertira des caractères accentués en entité HTML.
htmlentities($Ligne, ENT_NOQUOTES, 'UTF-8');

Eléphant du PHP | 60 Messages

12 févr. 2008, 16:39

Merci h0_noMan !

Ta proposition ne résout pas le problème, mais sur la page de la documentation en ligne parlant de htmlentities(), j'ai trouvé un post proposant une petite fonction de conversion du format Mac OS Roman en ISO 8859-1. Après quoi, il suffit de convertir le résultat en utf-8 par utf8_encode() et le tour est joué.

Voici le code :

Code : Tout sélectionner

function macRomanToIso($string) { return strtr($string, "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa1\xa4\xa6\xa7\xa8\xab\xac\xae\xaf\xb4\xbb\xbc\xbe\xbf\xc0\xc1\xc2\xc7\xc8\xca\xcb\xcc\xd6\xd8\xdb\xe1\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf1\xf2\xf3\xf4\xf8\xfc\xd2\xd3\xd4\xd5", "\xc4\xc5\xc7\xc9\xd1\xd6\xdc\xe1\xe0\xe2\xe4\xe3\xe5\xe7\xe9\xe8\xea\xeb\xed\xec\xee\xef\xf1\xf3\xf2\xf4\xf6\xf5\xfa\xf9\xfb\xfc\xb0\xa7\xb6\xdf\xae\xb4\xa8\xc6\xd8\xa5\xaa\xba\xe6\xf8\xbf\xa1\xac\xab\xbb\xa0\xc0\xc3\xf7\xff\xa4\xb7\xc2\xca\xc1\xcb\xc8\xcd\xce\xcf\xcc\xd3\xd4\xd2\xda\xdb\xd9\xaf\xb8\x22\x22\x27\x27"); } if (file_exists("Test.txt")) $Tab = file("Test.txt", FILE_USE_INCLUDE_PATH + FILE_IGNORE_NEW_LINES); else { echo "Fichier introuvable."; exit(); } foreach($Tab as $Ligne) echo utf8_encode(macRomanToIso($Ligne))."X<br />";