web-dev-qa-db-fra.com

jQuery AJAX Encodage de caractères

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

Voici le JS que j'utilise pour faire ceci:

    <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>

La valeur réelle AJAX fonctionne comme un charme. Mon problème réside dans la réponse à la demande.

Comme il s’agit d’un site Web français, il existe de nombreuses lettres accentuées. J'utilise le jeu de caractères ISO-8859-15 pour cette raison même. Cependant, dans la réponse à ma demande AJAX, les accents sont en train de devenir??), Car l'encodage des caractères semble redevenir UTF-8.

Comment puis-je éviter cela? J'ai déjà essayé d'ajouter du code 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?

De plus, pendant que l'un de vous regarde ici ... pourquoi la colonne la plus à droite semble-t-elle devenir plus petite quand une nouvelle page est chargée, ce qui provoque la distorsion du tableau et chaque <li> dans le <td> pour passer à la ligne suivante?

À votre santé

57
Salty

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

[~ # ~] éditer [~ # ~]
[ Copie d'archive du fichier de test. ] avec vos données

Tout devrait être UTF-8 en premier lieu. J'ai chargé les fichiers dans Notepad ++, convertis en utf-8 et modifié manuellement les caractères en accents nécessaires. Une fois cela fait, tout fonctionne à merveille.

BTW, à moins que votre serveur ne soit défini comme un fichier php-process .html, les fichiers que vous chargez avec ajax ne reçoivent 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).

23
yoavf

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 devrez également spécifier le jeu de caractères sur le serveur.

<?php header('Content-Type: text/html; charset=ISO-8859-15'); ?>
63
Magnar
$str=iconv("windows-1250","UTF-8",$str);

ce qui m'a aidé sur le

19
anony

Vous devez configurer votre serveur pour utiliser ISO-8859-15 comme codage de caractères (en ajoutant 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 html. Cela ne devrait pas arriver. Utilisation d'en-têtes HTTP en direct Je ne peux pas voir l'en-tête HTTP de jeu de caractères approprié. Utilisez-le pour votre première page et le service ajax.

10
kgiannakakis

Pour mon PHP application, la solution était d'inclure la fonction utf8_decode pour chaque variable get in $_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!!!)

7

Je suggère fortement l'utilisation de la méthode d'échappement javascript ()

vous pouvez utiliser cela avec jQuery en récupérant une valeur de formulaire comme ceci:

var encodedString = escape($("#myFormFieldID").val());
7
Doug

Lors de l’impression des variables dans le fichier ajax. Mettre un

htmlentities()

Autour d'eux, voyez si ça marche. Travaillé pour moi dans une application ajax islandaise.

6
Ólafur Waage

Je rencontrais des problèmes similaires en travaillant dans un système de commentaires de contenu sur notre portail espagnol. Ce qui a finalement résolu mon problème, après de nombreuses heures de recherche, au lieu de jouer avec le jeu de caractères jQuery, semble utiliser utf-8 quoiqu’il en soit, c’était de décoder d’utf-8 à ISO-8859-1 dans le PHP ayant traité le POST ajax. Dans PHP, il existe une fonction intégrée, utf8_decode()] _, la première chose que je fais avec la chaîne de commentaires est cette:

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

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

Bonne chance et paix partout! Seba

4

J'ai bricolé ce problème et découvert que cette solution fonctionne pour Firefox et Safari (oui, sur un Mac en ce moment).

lors de l'obtention de la demande, j'ai créé un contenu-type = 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 dites-moi si quelqu'un découvre que cela ne fonctionne pas dans à-dire.

3
Kyuss

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

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

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

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

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

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

Response.Charset = "windows-1252"

Dans Ma page ASP, avant que le jeu de caractères ne soit défini et que j'avais enregistré mon fichier avec le codage ANSI (avec un éditeur de texte comme notepad ++)

2) Dans le fichier html qui appelle le fichier ASP avec la méthode jquery ajax, j’ai inséré le paramètre content-type 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. Étrangement, je constate que mon jquery fonctionne avec Windows-1252 mais ne fonctionne pas avec un jeu de caractères ISO-8859-1: case jquery ajax, méthode donne une exception.

3
Rob

J'ai essayé beaucoup de suggestions pour lire dans un fichier texte avec des caractères spéciaux allemands (ä, ö, ü). À la fin:

 $.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);
        }
    });

laissez-moi lire les caractères spéciaux, mais seulement APRÈS avoir explicitement enregistré FileName.txt au format UTF-8. Le format standard de sauvegarde des fichiers texte dans l’éditeur Windows est ANSI et non TF-8, mais il peut être modifié si vous le souhaitez. "Enregistrer sous" et utilisez la liste déroulante à côté du bouton Enregistrer ou utilisez un meilleur éditeur pour commencer.

2
jank

Je n'accepte pas que tout soit au format UTF-8, vous pouvez le faire fonctionner parfaitement avec ISO 8859.

ma réponse en stackoverflow

1
Rodrigo Asensio
<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> 

C’est le script à partir duquel je tire mon contenu de la page blabla.php.

Quand je reçois mes données sur le succès, mes accents n'apparaissent pas.

J'ai trouvé une très bonne solution de travail par moi-même pour récupérer des données avec des accents sur les données récupérées à partir 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>                           
}
1
classics40

J'ai eu le même problème. J'ai un fichier texte avec des données JSON qui a du texte 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 renvoyées avaient toujours des lettres françaises accentuées incorrectes.

Le texte json ressemble à ceci:

{
    "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": ""
        }
        ...
    ]
}

Remarquez dans l'exemple de données ci-dessus, le 3ème élément, j'ai placé le texte avec les lettres accentuées correctes é Et incorrectes ê.

Pour votre information, il semblait y avoir une configuration globale du projet Eclipse utilisant le codage de caractères ISO-8859-1. Dans votre cas, le codage peut être différent.

Après avoir vérifié les solutions ci-dessus et joué 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
  • Copier le texte
  • Allez à Eclipse, ouvrez le fichier texte contenant les données
  • Cliquez avec le bouton droit sur le fichier dans l'explorateur, ouvrez les propriétés et modifiez le codage en ISO-8859-1.
  • Corrigez le texte pour qu'il soit affiché correctement. Utilisez 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 pouvant apparaître en HTML avec une forme amusante. Supprimer cette lettre cachée
  • Sauvegarder le fichier

Maintenant, dans mon cas, je n'ai spécifié aucune option de codage dans l'appel Ajax et cela fonctionne bien. En outre, si je modifie le codage du fichier texte avec les données JSON, cela fonctionnera toujours correctement.

Tarek

0
tarekahf

Si l'application entière utilise ISO-8859-1, vous pouvez modifier votre jquery.js en remplaçant toutes les occurrences de encodeURIComponent par escape (il y a 2 occurrences à remplacer dans le script jquery actuel - 1.5 .1)

Voir encodeUIComponent et échappement pour plus d'informations

0
Jonathan Pasquier

Si vous utilisez CodeIgniter, vous pouvez résoudre ce problème en ajoutant le code suivant à votre contrôleur avant de charger des vues (en supposant que vous avez correctement configuré charset sur votre configuration. Sinon, mettez simplement charset=whateveryouwant.

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

Pour ce faire, j'ai ajouté cette ligne au constructeur de MY_Controller, ma super-classe pour tous les contrôleurs. Ainsi, je m'assure de ne rencontrer aucun problème de codage.

En passant, cela n’affecte pas les retours JSON (encodés en UTF-8).

0
Christian Dechery

J'ai eu le même problème avec les pages que:

  • Montrez bien quand on l'appelle normalement
  • Les caractères spéciaux ont-ils été confus lorsqu'ils ont été appelés via une requête 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.

0
jeroen

J'ai rencontré le même problème et essayé de plusieurs façons. Et j'ai trouvé la solution. Si vous définissez l'en-tête de 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 caractères semblent corrects

0
Hüseyin BABAL

J'ai essayé de lire un fichier json/texte local en utilisant $ .ajax et l'encodage ne fonctionnait pas au début .. Je l'ai obtenu en enregistrant le fichier json au format UTF-8. Ceci peut être fait simplement par le bloc-notes Windows .. utilisez "enregistrer sous", puis sous le nom du fichier, vous pouvez définir le codage sur UTF-8.

bonne chance!

0
doron

Je suis venu par cette question avec exactement le même problème que le demandeur. Les réponses ici sont très instructives, et j’ai essayé presque toutes les réponses suggérées. Aucune des réponses ici ne fonctionnait pour moi cependant - il pourrait y 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.

Alors maintenant, j'ajoute à la liste déjà longue de réponses une solution personnelle qui résout mon problème de codage.

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

mysql_set_charset('utf8',$connection);

et à part ça:

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

Le fait 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 le codage dans le script - le fichier lui-même doit être correctement codé.

0
Steeven

Vient de changer {"type":"GET"} à {"type":"POST"} et a travaillé comme un charme avec ISO-8859-1

0
MauroPorras