8
votes

Pourquoi ma chaîne unicode est-elle corrompue lorsqu'elle est passée de Java Applet au script Java?

Je suis jolie nouveau, alors ne soyez pas trop dur :)

Question (TL; DR) H1>

Je suis confronté à un problème de passage d'un seul code code > à partir d'un javax.swing.japlet code> dans une page Web à la partie script Java. Je ne suis pas sûr que ceci est de savoir si un bug ou un malentendu des technologies impliquées: p>

problème h1>

Je veux transmettre une chaîne unicode d'un applet Java au script Java, mais le La chaîne est gâchée. Étrangement, le problème ne se produit pas dans Internet Explorer 10 em> mais dans chrome (v26) em> et firefox (v20) em>. Je n'ai pas testé les autres navigateurs cependant. P>

La chaîne renvoyée semble être correcte, à l'exception du dernier caractère Unicode. Le résultat dans le débogueur et la page Web Java Script serait: P>

  • ABC → ABC LI>
  • 表示 → 表 li>
  • ま → ま li>
  • リスト → ウォッチリス li>
  • アップロ → アップロ アップロ li>
  • ホ → �� li>
  • ホ → ホ (non déterministe) li>
  • アップロ アップロ アップロ ド ド → ド ド ド ド ABC LI> ul>

    La chaîne semble être corrompue aux derniers octets. Si cela se termine par un caractère ASCII, la chaîne est correcte. De plus, le problème ne se produit pas dans chaque combinaison et non à chaque fois (pas sûr de cela). Par conséquent, je soupçonne un bug et j'ai bien peur d'envoyer une question invalide. P>

    Configuration du test H1>

    Un ensemble minimaliste comprend une applet qui renvoie un peu unicode (UTF-8 ) Strings: P>

     /* test.html */
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        </head>
        <body>
            <span id="output"/>
            <applet id='output' archive='test.jar' code=testApplet/>
        </body>
    
        <script type="text/javascript" charset="utf-8">
            var applet = document.getElementById('output');
            var node = document.getElementById("1");
            for(var i = 0; i < applet.getLength(); i++) {
                 var text = applet.getTestString(i);
             var paragraphNode = document.createElement("p");
             paragraphNode.innerHTML = text;
             node.appendChild(paragraphNode);
            }
        </script>
    </html>
    


7 commentaires

Je suis intéressé par ce que le vrai problème est. Une idée que j'ai trouvée est la suivante: assurez-vous que javac et / ou jar utilise le codage UTF8 - si vous ne le spécifiez pas, il utilise la défaillance de la machine (qui pourrait Soyez un problème)


Merci ! Je vais essayer cela plus tard. Je tiens à souligner que le flux de données du script Java vers Applet (paramètre appelant) fonctionne comme prévu. Seul le retour est en désordre.


Absolument. Vous avez montré / expliqué que tout fonctionne bien, à l'exception de la chaîne renvoyée dans des cas spéciaux (le dernier caractère de la chaîne renvoyée a un caractère unicode). Je pense que vous avez très bien expliqué la situation et que vous avez tout mis en place de manière très organisée :)


Pouvez-vous afficher le code qui écrit réellement la chaîne pour l'envoyer au navigateur?


Comme il s'agit peut éventuellement d'un duplicache de Java ne pas défaut à l'encodage UTF8 pour les chaînes Stackoverflow.com/Questtions/81323/...


@Danack a raison. Pouvons-nous voir le code qui envoie en réalité la chaîne au navigateur. Par défaut, les chaînes Java sont codées UTF-16 et le code à envoyer au navigateur doit spécifier explicitement le codage.


@Danack et Vikranty, je ne suis pas sûr si je comprends votre demande Comportley. Je compte sur la fonctionnalité JavaScript2Java intégrée du navigateur. Je suppose que c'est quelque chose comme l'ancien Liveconnect ( développeur.mozilla.org/de/ DOCS / JavaScript / Guide / ... ) Pour Chrome. La fonction Java, comme indiqué dans l'exemple, est GetTestString (int i) . L'appel JavaScript est Applet.getestSRing (i) .


4 Réponses :


1
votes

Si vous testez à Chrome / Firefox

Veuillez remplacer la première ligne avec ceci, puis testez-le, P>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


2 commentaires

Merci pour votre participation! J'ai essayé cela, mais toujours pas de chance.


Pouvez-vous publier HTML de la page après génération de page / liaison de la page (si Live), cela aidera davantage.



1
votes

Je suggère de définir un point d'arrêt sur xxx

et inspecter le texte dans la console JavaScript, par ex. avec xxx

ou xxx

ou xxx

Voir aussi

http://www.fileformat.info/ info / unicode / char / 30a6 / index.htm

https://developer.mozilla.org/en-us/docs/dom/window.escape (qui ne fait partie d'aucune norme)

et

https://developer.mozilla.org/en -Us / Docs / JavaScript / Référence / Global_Objects / Encodéoricomponent

ou des ressources similaires.

Vos fichiers source peuvent ne pas être dans le codage que vous supposez (UTF-8) .

JavaScript assume UTF-16 Strings:

http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.16

Java suppose également UTF-16:

http://docs.oracle.com/javase/1.5.0 /docs/api/java/lang/string.html

La commande Linux ou Cygwin Fichier peut vous montrer l'encodage de vos fichiers. < p> voir

http://linux.die.net/man/1 / Fichier (n'a pas trouvé de référence de kernel.org)


1 commentaires

Merci beaucoup pour votre réponse élaborée! Avec la fonction Encoduri , j'ai pu produire les octets finaux "corrompus" en chrome: ils semblent tous se terminer par % ef% bd% bd% ef% bf% bd% 00 . Je ne sais pas si c'est la vraie caractéristique, car Firefox ne montre pas du tout une chaîne corrompue (retourne une chaîne d'une longueur de 0 dans ce cas). En fait, j'ai pu résoudre le problème pour mon système d'exploitation (voir ma réponse embarrassante). Mais cela affecte toujours d'autres paramètres régionaux ... peut-être que la question reste valable avec la modification.



0
votes

D'accord, je suis un peu embarrassé, parce que je pensais que je l'ai essayé assez: j'utilisais réellement des locaux non latins (par exemple, chinois (PRC) ou japonais (Japon) dans le système Windows'a href="http://www.java.com/fr/download/help/locale.xml" Rel="nofollow"> Paramètres LIGALE . Quand j'ai changé Retour à anglais (USA) ou allemand (Allemagne) tout a fonctionné comme excpecté.

Je me demande toujours, pourquoi cela affecterait Chrome & Mozilla de manière aussi étrange, car Java et les navigateurs modernes devraient être basés sur unicode; Donc, je n'accepterai pas cela comme une réponse! Le problème se reproduit en retournant en japonais et je vais le tester sur différents systèmes.

Je tiens à remercier toutes les affiches de la commission de lumières ... et je vais toujours mettre des efforts pour résoudre cette question.


0 commentaires

1
votes

Vous devez vous assurer d'ajouter l'argument Java suivant à votre étiquette d'applet / incorporé:

-DFILE.CODING = UTF-8

I.e. java_arguments = "- dfile.encoding = utf-8"

Sinon, on vous attendra et traiter l'applet en tant que texte ASCII.


0 commentaires