2010-11-21 6 views
0

je l'ai fait les choses suivantes:erreur de la fonction PHP htmlspecialchar() lorsque vous essayez d'utiliser la chaîne UTF-8

  1. J'ai une feuille de calcul avec les données. Une des lignes a un caractère ü. Je sauvegarde ce fichier au format CSV dans OpenOffice.org. Quand il me demande un encodage de caractères, je choisis UTF-8.
  2. J'utilise Navicat pour créer une table de base de données MySQL, InnoDB avec UTF-8 utf8_general et importer le fichier CSV.
  3. J'essaie d'utiliser la fonction PHP htmlspecialchars($string, ENT_COMPAT, 'UTF-8')$string est la chaîne contenant le caractère spécial ü.

Il me donne une erreur: séquence non valide dans l'argument multi-octets. Lorsque je change 'UTF-8' avec 'ISO8859-1', aucune erreur n'est levée, mais le caractère incorrect est affiché. (Le caractère « caractère inconnu », ressemble à <?>)

Si j'utilise un formulaire HTML pour mettre à jour la chaîne dans la base de données, l'erreur disparaît et le caractère est affiché correctement, mais, quand je regarde alors le record navicat, il semble deux personnages:

[1/4][A with some thing on top of it]

Certains multi-octets qui ne se voit pas comme un character.`

Qu'est-ce qui se passe, où vont les choses mal, et que puis-je faire ?

Répondre

2

Bien que je ne comprends pas l'erreur « multi-octets invalide » vient, je suis assez sûr htmlspecialchars() est not your culprit:

For the purposes of this function, the charsets ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, and KOI8-R are effectively equivalent, as the characters affected by htmlspecialchars() occupy the same positions in all of these charsets.

Dans ma compréhension, htmlspecialchars() devrait fonctionner correctement pour une chaîne UTF-8 sans spécifier de jeu de caractères. Mon pari serait que soit la page HTML contenant le formulaire, soit la connexion à la base de données que vous utilisez n'est pas codée en UTF-8. Pour ce dernier, essayez d'envoyer un

SET NAMES utf8; 

à mySQL avant de faire l'insertion.

+0

Selon le journal de requête générale mysql, 'SET NAMES utf8' est réellement envoyé au serveur MySQL. Bien qu'il n'y ait pas de formulaire dans ce processus (il y en a un lorsque je mets à jour l'enregistrement), cela est mis à UTF-8 en utilisant une balise meta HTML. (Mais encore une fois, l'erreur apparaît déjà avant que le formulaire ne soit utilisé.) –

+0

@ Pelle pouvez-vous confirmer qu'il est effectivement envoyé au serveur * pour cette connexion *? Et pour confirmer, l'erreur que vous citez est réellement lancée par 'htmlspecialchars()'? –

+0

Compris. Tout était en UTF-8, SAUF: la connexion lors de l'utilisation de SELECT les données. Mettre SET NAMES UTF8 avant les instructions select l'a corrigé. –

Questions connexes