2010-11-25 21 views
1

j'ai un texte en utf-8 et je veux le décoder, en utilisant utf8_decode()
Mais quand je fais ce que je perds une partie du texte, utf8_decode() décode la chaîne jusqu'à ce qu'il trouve un personnage –
Une idée pour résoudre ce problème?retourne utf8_decode seulement une partie de la chaîne codée

+2

'utf8_decode' convertit de l'UTF-8 à l'ISO 8859-1. Vous pouvez perdre les caractères qui ne sont pas dans l'ISO 8859-1. – Gumbo

+0

Je sais que je peux perdre des caractères. Mais vous trouvez normal que la moitié du texte après un caractère particulier est perdu bien qu'il ne contienne pas de caractères spéciaux? –

+0

Avec iconv j'obtiens ceci même avec '// IGNORE':' Avis: iconv(): Détecté un caractère illégal dans la chaîne d'entrée' Une idée? –

Répondre

2

Peut-être iconv peut vous aider

+0

Même résultat avec iconv –

1

Peut-être – ne sont pas dans la norme ISO-8859-1? utf8_decode ne mange que des caractères utf8 qui existent également dans ISO-8859-1.

1

Vous voudrez probablement quelque chose de similaire à ceci:

$string = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 

Vous pouvez en savoir plus sur iconv dans the documentation. Selon votre utilisation, IGNORE peut être plus utile que TRANSLIT.

+0

Ne fonctionne pas avec les options –

+0

En fonction des commentaires de la documentation, une option de '// TRANSLIT // IGNORE' est également possible, et pour certaines personnes, le problème a été résolu. Je ne l'ai pas testé moi-même, mais ça vaut la peine d'essayer. – EdoDodo

+0

Juste essayé, n'a rien changé mais merci quand même –

2
†= E2 80 = 1110 0010 1000 0000 

Si c'est littéralement ce qui était dans votre texte UTF-8, il pourrait ne pas être UTF-8. Il devrait être suivi par un octet de plus commençant 10 pour être valide. En effet, un octet commençant par 1110 introduit une séquence de trois octets, les octets suivants commençant à 10, pour fournir un total de 16 octets de «charge utile» pour donner le point de code Unicode.

EDIT: Vous avez indiqué le caractère suivant 0x93 = 1001 0011 qui serait valide. La séquence UTF-8 0xE28093 = 0010 00 0000 01 0011 = 0x2013 qui est un EN DASH. Donc, il semble que UTF-8 plausible après tout!

+0

S *** ... Le problème vient peut-être de la manière dont les données ont été enregistrées (j'essaie d'importer depuis une autre base de données qui stocke les chaînes encodées utf8 dans les tables utf8_general_ci sans utiliser MySQL 'SET NOMS 'utf8' sur la connexion, quand je regarde via phpmyadmin je vois les caractères comme ceci: les quipes, tout se passe bien jusqu'à ce que je trouve ce cas avec - séquence ...) –

+0

Pour préciser, ce que j'ai dans le le texte est: '' '' –

1

Etes-vous sûr que EdoDodo's code ne fonctionne pas?

Essayez de forcer le navigateur à gérer la sortie en tant que iso-8859-1. Pour ce faire, vous avez besoin d'un fichier encodé en utf8 avec la chaîne (vous en avez besoin, car les éditeurs de texte peuvent utiliser un UTF-8 BOM invisible, et le navigateur peut passer en UTF-8 par rapport à l'ISO-8859-2 défini), et un l'autre avec le code php en encodage ansi (j'utilise Notepad++ juste pour être sûr que l'encodage est correct - il détecte l'encodage du fichier et le montre dans le coin inférieur droit, et vous pouvez aussi convertir les encodages).

donc créer un fichier dans utf-8 encodage appelé utf8.txt avec juste la chaîne:

– 

et créer un fichier ANSI codé index.php avec ce contenu:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
</head> 

<body> 

<?php 
$str = file_get_contents('utf8.txt'); 

echo "iconv(//IGNORE//TRANSLIT): " . iconv("UTF-8", "ISO-8859-1//IGNORE//TRANSLIT", $str) . "<br>\n"; 

pour les pages Web, je vous recommande fortement d'utiliser toujours l'encodage UTF-8, même si elle est en anglais.

+0

@Serty Vous pouvez essayer 'iconv (" UTF-8 "," UTF-8 // IGNORE ", $ str);' pour filtrer les mauvais caractères. Voir [cet article] (http://webcollab.sourceforge.net/unicode.html) pour plus d'informations. –

+0

Je viens d'essayer ça. Et cela ne supprime pas les caractères problématiques. Et un décodage après coupe la phrase à nouveau:/ –

+0

@Serty J'ai réussi à répliquer l'erreur sur une autre installation de PHP, donc édité la réponse avec la solution possible. –