Question

Y at-il un moyen de convertir une chaîne ANSI en UTF utilisant Java.

J'ai un sérialiseur personnalisé qui utilise des méthodes readUTF et writeUTF de la classe DataInputStream désérialiser et la chaîne de serialze. Si je reçois une chaîne codée en ANSI et est trop long, ~ 100000 caractères longue que je reçois l'erreur;

  

Causé par:   java.io.UTFDataFormatException:   chaîne encodée trop long: 106958 octets

Cependant, dans mes tests JUnit je suis en mesure de créer une chaîne avec 120000 « a 'et il fonctionne parfaitement

J'ai vérifié les postes suivants, mais toujours des erreurs;

Était-ce utile?

La solution

Cette erreur est pas causée par le codage des caractères. Cela signifie que la longueur des données UTF est erroné.

EDIT:. Il suffit de réaliser ceci est une erreur d'écriture, ne pas lire l'erreur

La longueur de UTF est seulement 2 octets de sorte qu'il ne peut contenir 64K octets UTF-8. Vous essayez de 100K d'écriture, il ne va pas au travail.

Cette limite est hardcoded et aucun moyen de contourner ce problème,

if (utflen > 65535)
    throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

Autres conseils

byte[] asciiBytes = ...;
String unicode = new String(asciiBytes, "US-ASCII");
byte[] utfBytes = unicode.getBytes("UTF-8");

ANSI codepage ? Il y a beaucoup de différents codages de caractères qui désignent tous « ANSI ». Le DOS est codepage 437 (sans les symboles de dessin). Si vous utilisez codepage 850, cela fonctionnera:

String unicode = new String(bytes, "IBM850");

(où bytes est un tableau avec les caractères ANSI). Après cela, vous pouvez convertir cette chaîne en un tableau d'octets avec un encodage en utilisant unicode.getBytes(encoding).

Windows utilise souvent la page de code 1252 (utilisation "windows-1252" pour cela).

ZZ Coder déjà répondu à la question, mais je l'ai écrit une explication plus détaillée et en proposant une solution de contournement sur ce blog . Au fond, le problème est en DataOutputStream, car elle limite la chaîne inscriptible à 64Ko. Il existe d'autres solutions de contournement possibles pour bystep la question, certains pourraient travailler sans casser le format de données binaires réelle l'on utilise ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top