2009-02-16 8 views
55

Je suis en train de coder un site web français. Il y a une page de calendrier, où un lien sur le côté peut être utilisé pour charger l'horaire d'un autre jour.jQuery AJAX Character Encoding

Voici le JS J'utilise pour ce faire:

<script type="text/javascript"> 
    function load(y) { 
     $.get(y,function(d) { 
      $("#replace").html(d); 
      mod(); 
     }); 
    } 
    function mod() { 
     $("#dates a").click(function() { 
      y = $(this).attr("href"); 
      load(y); 
      return false; 
     }); 
    } 
    mod(); 
    </script> 

L'AJAX réelle fonctionne comme un charme. Mon problème réside dans la réponse à la demande. Parce qu'il s'agit d'un site Web français, il y a beaucoup de lettres accentuées. J'utilise le charset ISO-8859-15 pour cette raison. Cependant, dans la réponse à ma demande AJAX, les accents deviennent des? S parce que le codage de caractères semble être changé en UTF-8.

Comment éviter cela? Je l'ai déjà essayé d'ajouter un peu de PHP en haut des documents demandés pour définir le jeu de caractères:

<?php header('Content-Type: text/html; charset=ISO-8859-15'); ?> 

Mais cela ne semble pas fonctionner non plus. Des pensées?

En outre, alors que l'un de vous êtes à la recherche ici ... pourquoi la colonne de droite semblent devenir plus petit quand une nouvelle page est chargée, ce qui provoque la table à déformer et chaque <li> dans le <td> pour envelopper à la ligne suivante?

Vive

Répondre

22

UTF-8 est censé gérer tous les accents et les caractères étrangers - pourquoi ne pas l'utiliser sur votre source de données?

EDIT
[Archive copy of the test file.] avec vos données

Tout doit être UTF-8 en premier lieu. J'ai chargé les fichiers dans le bloc-notes ++, convertis en utf-8 et changé manuellement les caractères en accents étaient nécessaires. Une fois cela fait, tout fonctionne comme un charme. Par ailleurs, à moins que votre serveur ne soit défini avec des fichiers php .html, les fichiers que vous chargez avec ajax n'obtiennent pas votre jeu de caractères iso. Si vous insistez pour utiliser le jeu de caractères iso, demandez un fichier php au lieu d'un fichier html et définissez le jeu de caractères dans l'en-tête (pas dans le fichier lui-même)

+0

Ne fonctionne pas. Voici la page avec un jeu de caractères UTF-8: http://www.aquate.us/u/7183981145359693722.jpg Comme vous pouvez le voir, les accents sont encore massacrés. – Salty

+0

Cela ne devrait pas arriver. Quelle est votre source de données? Base de données? Fichier texte plat? – yoavf

+0

Ce n'est pas avec la source de données, même si la même chose se produit. C'est juste si vous chargez simplement une page HTML avec des accents sur un jeu de caractères UTF-8. – Salty

10

Vous devez configurer votre serveur pour utiliser ISO-8859- 15 comme encodage de caractères (ajout de l'en-tête HTTP approprié). Le faire dans le corps du HTML ne va pas aider.

Je peux voir cette ligne

<?php header('Content-Type: text/html; charset=ISO-8859-15'); ?> 

à la source de votre code html. Cela ne devrait pas arriver. Utilisation des en-têtes HTTP en direct Je ne vois pas l'en-tête HTTP charset approprié. Utilisez cela pour votre première page et le service ajax.

6

Lors de l'impression des variables dans le fichier ajax. Mettez un

htmlentities() 

Autour d'eux, voir si cela fonctionne. A travaillé pour moi dans une application ajax islandaise.

+0

Thanx Ólafur c'est une solution très simple qui fonctionne! – tvgemert

58

La spécification du type de contenu sur l'appel AJAX a résolu mes problèmes sur un site norvégien.

$.ajax({ 
     data: parameters, 
     type: "POST", 
     url: ajax_url, 
     timeout: 20000, 
     contentType: "application/x-www-form-urlencoded;charset=ISO-8859-15", 
     dataType: 'json', 
     success: callback 
}); 

Vous devez également spécifier le jeu de caractères sur le serveur.

<?php header('Content-Type: text/html; charset=ISO-8859-15'); ?> 
+1

c'est bizarre, j'ai dû mettre contentType: "application/x-www-format-urlencoded; charset = UTF-8" dans mon appel ajax (avec jquery form plugin) pour fixer le codage des caractères dans mes pages ISO-8859-1/serveur – jneira

+1

+1 Merci! J'essayais de comprendre comment spécifier un type de contenu avec ajax, tout comme le gars ci-dessus pour passer en UTF-8 et vous m'avez donné exactement ce dont j'avais besoin. – gmustudent

+0

Merci pour ça! Travaillant dans un environnement Python/CGI, l'en-tête que je devais fournir sur le serveur était le suivant: 'print (" Type de contenu: text/html; charset = ISO-8859-15 \ n ")' – sc28

0

avait le même Ive problème avec pages:

  • Arrivez bien quand appelé normalement
  • -ce que les caractères spéciaux foiré un appel par une demande ajax

Pour résoudre le problème (en utilisant php), j'ai utilisé utf8_encode() ou htmlentities() sur les données source. Les deux ont travaillé, je les ai utilisés dans différents projets.

1

Je ne suis pas d'accord tout doit être UTF-8, vous pouvez le faire fonctionner parfaitement avec ISO 8859, je l'ai fait, s'il vous plaît lire ma réponse ici.

my response in stackoverflow

18
$str=iconv("windows-1250","UTF-8",$str); 

ce qui m'a aidé à la suite

+0

Vous êtes un héros, cela m'a aidé à envoyer des lettres accentuées comme é via une requête AJAX. –

+0

cela fonctionne pour moi grâce – Rajaraman

+0

a sauvé ma journée .. Merci beaucoup ... Cela devrait être la réponse acceptée .. – meen

7

Je strongl suggère l'utilisation de la méthode escape javascript()

vous pouvez l'utiliser avec jQuery en saisissant une valeur de forme comme si:

var encodedString = escape($("#myFormFieldID").val()); 
+0

c'est ce qui m'a aidé avec l'hébreu (windows-1255) - merci! – kneidels

4

Je devais si problèmes milar, travaillant dans un système de commentaires de contenu dans notre portail espagnol. Ce qui a finalement résolu mon problème, après de nombreuses heures de recherche, au lieu de jouer avec jQuery jeu de caractères, qui semble utiliser utf-8, peu importe quoi, il devait décoder de utf-8 à ISO-8859-1 dans le PHP qui traité le POST ajax. En PHP il y a une fonction intégrée, utf8_decode(), donc la première chose que je fais avec la chaîne de commentaires est la suivante:

$comentario = utf8_decode($_POST['comentario']); 

(puis j'ai utilisé nl2br() et htmlentities() fonctions PHP afin de préparer le texte à stocker avec des entités html au lieu des caractères spéciaux)

Bonne chance & Paix partout! Seba

3

J'ai triché avec ce problème et ai découvert que cette solution fonctionne pour Firefox et Safari (oui, im sur un mac pour le moment).

lors de l'obtention de la demande, je l'ai fait un type de contenu = iso-8859-1 ici:

if (window.XMLHttpRequest) { // Mozilla, Safari, ... 
    httpRequest = new XMLHttpRequest(); 
     if (httpRequest.overrideMimeType) { 
      httpRequest.overrideMimeType('text/xml; charset=ISO-8859-1'); 
     } 
    } 

S'il vous plaît me dire si quelqu'un découvre cela ne fonctionne pas à savoir.

0

ont juste changé {"type":"GET"} à {"type":"POST"} et a fonctionné comme un charme avec ISO-8859-1

7

Pour mon application PHP la solution est fonction include de utf8_decode pour chaque variable get $_POST.

Ex: (côté serveur)

if(strtoupper($_SERVER['REQUEST_METHOD']) == "POST"){ 
$variable = htmlentities($_POST['variable']); // wrong 
$variable = htmlentities(utf8_decode($_POST['variable'])); // right 
} 

Abraços !!! (Bye Bye !!!)

+0

Merci, Rafael! J'ai chassé pendant des siècles en essayant toutes les suggestions que je pouvais trouver et finalement cela a résolu pour moi! utf8_decode était ce qui manquait! Merci. – BruceHill

+0

Cela a résolu mon problème aussi - génial de l'avoir résolu: D – trueheart78

0

Si l'ensemble de l'application utilise ISO-8859-1, vous pouvez modifier votre jquery.js remplacer toutes les occurences de encodeURIComponent par escape (il y a 2 occurrences pour remplacer dans le script jquery en cours - 1.5.1)

Voir encodeUIComponent et escape pour plus d'informations

3

J'ai eu un problème similaire avec ASP avec mes pages. Je suis résolu si:

1) Inséré au début du fichier ASP appelé par Jquery méthode ajax l'instruction:

Response.Charset = "windows-1252" 

Dans Ma page asp avant que le charset n'a pas été défini et que j'avais sauvé mon fichier avec ANSI encodage (avec un éditeur de texte comme Notepad ++)

2) Dans le fichier html qui appelle le fichier ASP avec la méthode ajax jquery j'ai inséré le type de contenu paramètre que vous voyez ci-dessous:

$.ajax({   
data: parameters,   
type: "POST",   
url: ajax_url, 
datatype: 'html',   
contentType: "text/html;charset=windows-1252", 

En bref, il est important de définir dans votre fichier ASP appelé le jeu de caractères. Bizarrement, je vois que ma jquery fonctionne avec windows-1252 mais ne fonctionne pas avec le charset ISO-8859-1: dans ce cas, la méthode jquery ajax donne une exception.

1
<script type="text/javascript"> 
    function GetContent(idUser){ 
    $.ajaxSetup({ 
     url: 'ping.php' 
    }); 

    $.ajax({ 
     type: "POST", 
     url: "blablabla.php", 
     dataType: "text", 
     data: ({ParamUserID:idUser}),// here we def wich variabe is assiciated 
     contentType: "application/x-www-form-urlencoded; charset=iso-8859-1", 
     success: function(html) { 
     $('#user_specified_content').html(html); 
     } 
    });  
    } 
</script> 

Ceci est le script dont je récupère le contenu depuis la page blabla.php.

Lorsque je reçois mes données en cas de succès, mes accents n'apparaissent pas.

J'ai trouvé une super bonne solution de travail par mon propre pour aller chercher des données avec des accents sur les données extraites de la fonction .success

Sur ma page blabla. Je l'ai fait pour apporter une solution à mon problème:

J'utilise utf8_encode(place your data here) dans mon fichier php. Voir en action ci-dessous:

while($row = sqlsrv_fetch_array($recordset)) 
{       
    <option value="<?php echo $row["xyz"]; ?>"><?php echo utf8_encode($row["gName"]) . ' | ' . utf8_encode($row["gManagerName"]); ?></option>       
} 
2

J'ai eu un problème avec des lettres suédoises/norvégien montrant des points d'interrogation, malgré avoir précisé:

contentType: "application/json; charset=utf-8", 

Cela a été résolu en ajoutant encodeURIComponent à la chaîne.

url: "/set_comment.do?text=" + encodeURIComponent(comment), 
0

J'ai rencontré le même problème et essayé plusieurs façons. Et j'ai trouvé la solution. Si vous définissez l'en-tête de la demande pour "Accepter" comme ci-dessous;

$.ajax({ 
     data: parameters, 
     type: "POST", 
     url: ajax_url, 
     dataType: 'json', 
     beforeSend : function(xhr) { 
      xhr.setRequestHeader('Accept', "text/html; charset=utf-8"); 
     }, 
     success: callback 
}); 

vous verrez que tous les personnages semble correct

0

Je suis venu par cette question avec exactement la même question que le demandeur. Les réponses sont très instructives et j'ai essayé presque toutes les réponses suggérées.Aucune des réponses ici n'a fonctionné pour moi cependant - il y aurait pu avoir une légère différence dans mon problème. Et cela semble être le cas pour beaucoup. J'ai tellement essayé avant de finir avec une réponse. Maintenant, j'ajoute à la liste déjà longue de réponses, une solution de mon propre qui a résolu mon genre de problème d'encodage.

Je n'ai fait que deux choses. Dans le script de connexion de base de données I ajouté:

mysql_set_charset('utf8',$connection); 

et à part ça:

  • J'ai changé l'encodage de tous les fichiers au format UTF-8

Le point est que tout doit être du même encodage. Et lors de la création de nouveaux fichiers php, pour les scripts, il ne suffit pas de changer l'encodage dans le script - le fichier lui-même doit être correctement codé.

0

Si vous utilisez CodeIgniter vous pouvez résoudre ce problème en ajoutant le code suivant à votre contrôleur avant de charger les vues (en supposant que vous avez charset correctement configuré sur votre configuration. Dans le cas contraire, il suffit de mettre charset=whateveryouwant.

$this->output->set_header('Content-type: text/html; charset='.$this->config->item('charset')); 

La façon dont je l'ai fait était d'ajouter cette ligne au constructeur de MY_Controller, ma super-classe pour tous les contrôleurs, de cette façon je m'assure que je n'aurai aucun problème d'encodage nulle part. (qui sont encodés en UTF-8)

0

J'ai essayé de lire un fichier json/texte local en utilisant $ .ajax et l'encodage n'a pas fonctionné au début. Je l'ai fait fonctionner en enregistrant le fichier json comme encodage UTF-8. Cela peut être fait simplement par le bloc-notes de Windows .. utilisez "enregistrer sous", puis en dessous du nom de fichier, vous pouvez définir l'encodage en UTF-8.

bonne chance!

2

J'ai essayé de nombreuses suggestions à lire dans un fichier texte avec des caractères spéciaux allemands (ä, ö, ü). En fin de compte:

$.ajax({ 
     async:false, 
     type: "GET", 
     url: "data/FileName.txt", 
     dataType: "text", 
     contentType: "application/x-www-form-urlencoded;charset=UTF-8", 
     success: function (data) { 
      alert(data); 
     } 
    }); 

me permettent de lire les caractères spéciaux, mais seulement après que je explicitement sauvé FileName.txt dans le format UTF-8. Le format standard pour enregistrer les fichiers texte dans l'éditeur Windows est ANSI et non UTF-8, mais il peut être modifié si vous "enregistrez sous" et utilisez la boîte de dépôt à côté du bouton de sauvegarde ou utilisez un meilleur éditeur pour Commencer avec.

0

J'ai rencontré un problème similaire. J'ai un fichier texte avec des données json qui a du texte en français. Il y avait toujours un problème d'affichage de certains caractères. Dans mon cas, le programme JavaScript utilise Ajax pour récupérer le fichier texte JSON comme suit:

$.ajax({ 
    async: false, 
    type: 'GET', 
    url: 'some-url', 
    success: function(data, status) { 
     mainController.constructionStageMaster = data.records; 
    } 
}); 

Les données retournées ont toujours eu des lettres accentuées françaises incorrectes.

Le texte JSON se présente comme suit:

{ 
    "records": [ 
     { 
      "StageDesc": "Excavation, Fondation et Bases", 
      "Allowed": 9, 
      "Completed": 0, 
      "TotalCompleted": "" 
     }, 
     { 
      "StageDesc": "Étanchement et Remblayage", 
      "Allowed": 3, 
      "Completed": 0, 
      "TotalCompleted": "" 
     }, 
     { 
      "StageDesc": "Encadrement et revêtement mural intermédiaire", 
      "StageDesc_fr": "Encadrement et revêtement mural intermédiaire np++", 
      "StageDesc_fr2": "Encadrement et revêtement mural intermédiaire", 
      "Allowed": 15, 
      "Completed": 0, 
      "TotalCompleted": "" 
     } 
     ... 
    ] 
} 

Note dans les données ci-dessus de l'échantillon, le 3ème élément, j'ai placé le texte avec le é correct et incorrect ê lettres accentuées en français. Pour votre information, il semble qu'il y ait une configuration globale du projet Eclipse utilisant le codage de caractères ISO-8859-1. Dans votre cas, il se peut que l'encodage soit différent.

Après avoir vérifié les solutions ci-dessus et de jouer avec le projet, voici ce qui a résolu mon problème:

  • Trouver la source du texte qui a l'affichage correct du texte français
  • Copiez le texte
  • Aller Eclipse, ouvrez le fichier texte qui contient les données
  • clic droit sur le fichier dans l'explorateur, ouvrez les propriétés et changer le codage en ISO-8859-1
  • Corrigez le texte pour qu'il s'affiche correctement. Utiliser copier/coller ou le clavier
  • Vous devrez peut-être utiliser les touches fléchées du clavier (gauche/droite) pour vous assurer qu'il n'y a pas de lettres coupables cachées qui apparaîtront sur le HTML avec une forme amusante. Supprimer cette lettre cachée
  • Enregistrez le fichier

Maintenant, dans mon cas, je ne précise aucune option de codage dans l'appel Ajax et il fonctionne très bien. En outre, si je change l'encodage du fichier texte avec des données json, cela fonctionnerait bien.

Tarek