Comment puis-je encoder des caractères unicode supplémentaires à partir d'un tableau d'octets en Java?

rm-vert:

J'utilise un InputStreampour lire des octets à partir d' un serveur TCP (écrit en C #) en un byte[], et les coder en une chaîne à l' aide new String(byteArray, "UTF-16LE"). Cette méthode code des caractères dans le plan multilingue de base très bien, mais ne gère pas les caractères supplémentaires.

Je comprends que les octets en C # ne sont pas signés alors que les octets Java sont signés, et qu'un caractère supplémentaire peut être composé d'un ou deux valeurs unicode.

        ByteBuffer wrapped = ByteBuffer.wrap(dataBytes);
        wrapped.order(ByteOrder.LITTLE_ENDIAN);
        short noOfSites = wrapped.getShort();

        for(int i = 0; i < noOfSites; i++){
            short siteNo = wrapped.getShort();
            short textLength = wrapped.getShort();
            byte[] textBytes = new byte[textLength];
            wrapped.get(textBytes, 0, textLength);

            for(byte bite : textBytes){
                System.out.print(bite+" ");
            } //just to see what's in the byte array

            String siteText = new String(textBytes, "UTF_16LE");
            System.out.println(siteNo + ": " + siteText);
            siteList.add(new Site(siteNo, siteText));
            publishProgress(siteNo + " - " + siteText);
        }

Dans ce cas, dataBytesest le tableau d'octets contenant les octets lus à partir du serveur, noOfSitesest le nombre d'objets à lire à partir du serveur, siteNoest un ID, textLengthest le nombre d'octets contenant le nom du site, et textBytesest le tableau qui contient ces octets.

Lors de la réception du mot « MUNSTER » du serveur, les octets lus dans la mémoire tampon sont: 77 0 -3 -1 78 0 83 0 84 0 69 0 82 0. Cependant, le caractère « Ü » est non reconnue, que je suppose est en baisse à la -3 -1valeur UTF-16 que Java tente (et à défaut) à coder. Je comprends que dans C #, « Ü » est représenté par DC-00, mais je ne comprends pas pourquoi cela devient -3 -1en Java. Toute aide serait grandement appréciée.

jsbueno:

Le caractère « U » ne soit pas codé dans la source - la séquence qui devient pour le côté de l' évier « -3, -1 », est 0xfffd- UTF 16 LE codage pour le caractère de remplacement .

Sans voir le code côté serveur , il est difficile de dire ce qui se passe, mais son mauvais . Utf-16 peut traiter comme caractères « Ü » sans sortir de son chemin. En fait, il est même pas sur les premiers 256 unicode codepoints, beaucoup moins en dehors du plan multilingue de base. (C'est un personnage assez de commun dans beaucoup de langues occidentales, et même le caractère latin, comment pourrait - il d'un plan conçu pour les caractères de maintien pour toutes les langues dans le monde?)

Ce qui se passe est que le chemin de code de votre texte au format UTF-16 destiné à transfert de fil est, à un moment donné, étant explicitement chargé de définir le caractère de remplacement pour toute ombles qui ne sont pas ASCII (héritage unicode codes points 0x20 -0x7f, qui comprennent seulement des caractères latins non accentués).

Pour être clair , autrement dit: les données sont corrompues côté serveur, et tous les caractères non-ASCII montage , il sera probablement écrasé au « caractère de remplacement ». Aucun montant de tripoter sur votre code côté client peut résoudre ce problème.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

chaudétiquette

Archive