jQuery: AJAX trémas & caractères spéciaux sont un gâchis
Je viens de créer ma première fonction ajax avec jQuery qui fonctionne réellement, mais malheureusement, l'encodage des caractères (pour les personnages comme ä, ö, ü, ß, è, æ, å, ø) est un cauchemar.
Mes fichiers et ma base de données sont tous en UTF-8. J'ai essayé une multitude d'options dans la fonction ajax et le PHP de la fonction, aucune n'était satisfaisante.
C'est mon ajax
var dataString = {
'name': name,
'mail': mail
//other stuff
}
$.ajax({
type: "POST",
url: "/post.php",
data: dataString,
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
cache: false,
success: function(html){
//do stuff
}
Je l'ai essayé sans contentType: "application/x-www-form-urlencoded;charset=UTF-8" et j'ai essayé d'envelopper les données affectées dans encodeURIComponent(), aucun n'a fonctionné.
Quand je l'utiliser AJAX avec htmlentities() dans mon php, mon trémas ressembler à ceci en texte brut:
UE �, AE �, OE �, de l'ue ü, ae ä, oe o
Et comme cela dans la base de données:
UE Ãœ , AE Ã", OE Ö, de l'ue ü, ae ä, oe o
Si je n'utilise pas de htmlentities (), mais mysql_real_escape_string() à la place (ou aucun des deux), ils ont l'air bon en texte brut, mais ils ressemblent à ceci dans la base de données:
AE Ã", OE Ö, de l'UE Ãœ, ae ä oe ö ue ü
J'ai essayé des tonnes d'options pour les heures maintenant, mais je ne peux pas trouver une solution qui fonctionne. Jusqu'à présent, la seule option me semble que j'ai est d'avoir de ressembler à un désordre total dans la base de données, mais ce serait très contraproductive si ces ensembles de données doivent être modifiés.
J'ai essayé de changer ma base de données de l'encodage latin1, mais il n'y a pas de différence
OriginalL'auteur rayne | 2010-03-29
Vous devez vous connecter pour publier un commentaire.
Nah, si vous êtes de passage dans un
{}
objet, jQuery va prendre soin de l'UTF-8 et l'URL de codage pour vous.Si vous devez utiliser
htmlentities()
, vous devez préciser votre encodage estUTF-8
dans l'option$charset
argument, sinon ça va (bêtement) par défaut pour le traitement de tous les octets comme ISO-8859-1, et les encoder à des références d'entité, un pour chaque octet.Mieux est d'utiliser
htmlspecialchars()
au lieu de cela, comme il ne cherche pas à appliquer inutile de l'encodage des caractères autres que les quelques caractères ASCII qui en ont vraiment besoin.Comment allez-vous déterminer qui? L'outil que vous utilisez pour saisir les données de la base de données de savoir sur Unicode? (Si c'est un peu louches web PHP interface d'admin, peut-être pas. PHP n'est pas idéal à Unicode.)
Il est possible que vous stockiez des bon octets UTF-8 dans la base de données, mais dans les tableaux marqué comme ayant un Latin-1 classement. Ce travail, en autant que vous obtiendrez les mêmes octets comme vous y mettre, mais si MySQL ne savent pas qu'ils sont octets UTF-8 puis la casse de la chaîne de comparaisons à l'extérieur de la plage ASCII ne fonctionne pas droit, alors à la recherche de
Ä
ne correspond pasä
. Qui peut ou ne peut pas d'importance pour vous.Whoah, prudent. HTML échapper est pour l'étage de sortie à la page. SQL-chaîne littérale en fuite se produit lors de la création d'une requête SQL. Vous avez besoin des deux, mais ne pas les mélanger ou de tenter de les faire à la même étape, ou vous aurez toutes sortes de bizarre s'échappe raté et les vulnérabilités potentielles.
OK, Contrairement à d' claims à l'appui d'Unicode, donc j'espère que ça doit être de bonne. S'il est important pour vous d'avoir les données de regarder droit dans l'interface d'administration, vous devez utiliser
CREATE TABLE ... CHARACTER SET utf8
pour créer vos tables et appelmysql_set_charset('utf8')
à partir de PHP avant d'utiliser la connexion de base de données.OriginalL'auteur bobince
Il semble que le problème est survenu lors de l'insertion des données dans la base de données. Êtes-vous à l'aide de MySQL? Après la connexion à votre serveur de base de données d'émission de la requête :
Ce sera de dire au serveur de base de données que la connexion client souhaite envoyer des données en UTF-8 et de l'interpréter comme tel.
Aussi, lors de l'envoi des données vers le navigateur assurez-vous de définir l'en-tête ContentType
Ce sera de dire au navigateur d'interpréter les données en UTF-8.
OriginalL'auteur Stephen Curran
Essayez d'utiliser cette fonction à la place de htmlentities
htmlspecialchars()
OriginalL'auteur Codler
J'ai enfin trouvé une solution qui fonctionne pour moi; je retiré la
contentType: "application/x-www-form-urlencoded;charset=UTF-8"
de mon ajax de jQuery, je ne l'utilisehtmlentities($value, ENT_NOQUOTES, 'UTF-8');
pour le traitement des données et SQL de ma base de données est définie à l'utf8 unicode.Les caractères s'affichent correctement et sont stockés
ä
pour ä et ainsi de suite dans la base de données.LIKE '%uml%'
(il ne sera pas en mesure de faire la différence entre un système de tréma et le texte “uml”), chaqueSUBSTRING
l'exploitation (y compris implicite de règlage en raison de la longueur des limites) les risques de rupture d'une entité de référence et de la production rompu HTML, et il va gâcher toute non-HTML utilisation de la table de données comme l'envoi de mail.Oh vraiment? Je ne le savais pas, mais je suis un mauvais programmeur en général 😉 Quand j'ai enlever le htmlentities() à partir de mon script, mes caractères spéciaux ressembler à ceci dans la base de données à nouveau: ü Curieusement, lorsque j'envoie les données uniquement par le biais de PHP (lors de la désactivation de javascript), ils ont l'air bien dans la base de données (ä). Donc, le problème est probablement provoqué par l'ajax de jQuery.
OriginalL'auteur rayne