Convertir des caractères ANSI en UTF-8 en Java
Est-il un moyen de convertir une chaîne ANSI UTF l'aide de Java.
J'ai un custom sérialiseur qui utilise readUTF & writeUTF méthodes de la classe DataInputStream à désérialiser et serialze chaîne. Si je reçois une chaîne de caractères encodés en ANSI, et trop longue, ~100000 caractères, je reçois l'erreur;
Causés par:
java.io.UTFDataFormatException:
chaîne codée trop long: 106958 octets
Toutefois, dans mes tests Junit, je suis capable de créer une chaîne avec 120000 'un et il fonctionne parfaitement
J'ai vérifié les postes suivants mais ayant encore des erreurs;
- La conversion UTF-8 en ISO-8859-1 en Java - comment garder comme seul octet
- Comment puis-je remplacer les caractères latins accentués en Ruby?
Voulez-vous dire ASCII? Si si il est déjà en UTF-8 - pouvez-vous nous expliquer un peu plus. Montrer les erreurs etc.
Aucune ANSI != ASCII. ANSI est toute une collection de pages de code.
en raison de restrictions de taille sur readUTF et writeUTF j'ai modifié mon sérialiseur envoyer le texte dans les pièces
Aucune ANSI != ASCII. ANSI est toute une collection de pages de code.
en raison de restrictions de taille sur readUTF et writeUTF j'ai modifié mon sérialiseur envoyer le texte dans les pièces
OriginalL'auteur n002213f | 2009-09-23
Vous devez vous connecter pour publier un commentaire.
Cette erreur n'est pas causée par l'encodage des caractères. Cela signifie que la longueur de l'UTF données est incorrect.
EDIT: Viens de réaliser que c'est une erreur d'écriture, pas d'erreur de lecture.
L'UTF longueur est de 2 octets, de sorte qu'il ne peut contenir 64 K octets UTF-8. Vous êtes à essayer à l'écriture de 100K, il ne va pas au travail.
Cette limite est codé en dur et aucun moyen de contourner cela,
Vous avez à me montrer vos cas de test. Ils sont mauvais. Voir mes modifications.
j'ai utilisé le code suivant pour générer la chaîne de test; StringBuffer sb2 = new StringBuffer(); for (int i=0; i < 120000;i++) { sb2.append (""); } String longString2 = sb2.toString();
Vous pouvez créer de longues chaînes, jusqu'à ce mémoire. Vous ne pouvez pas écrire de longues chaînes à l'aide d'writeUTF(). Écrire de manière autonome avec une 4 de la longueur en octets de l'en-tête.
a noté, merci
OriginalL'auteur ZZ Coder
OriginalL'auteur iammichael
Qui Page de codes ANSI? Il ya beaucoup de différents encodages de caractères qui font tous référence à "ANSI". Le DOS de la page de codes est 437 (sans le dessin des symboles). Si vous utilisez la page de codes 850, cela va fonctionner:
(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 codage à l'aide deunicode.getBytes(encoding)
.Windows utilise souvent la page de codes 1252 (utiliser "windows-1252" pour que).
cela vous permettra de transformer ANSI à partir de telnet, comme une boue de jeu, à un "régulier" de la Chaîne?
Ceci permet de convertir des octets à partir de n'importe quelle source vers une chaîne Unicode. Mais pour que cela fonctionne correctement, vous devez savoir exactement lequel l'encodage de la source à l'aide. Il n'a pas d'importance si c'est un fichier, un service à distance ou d'un périphérique matériel.
OriginalL'auteur Aaron Digulla
ZZ Codeur déjà répondu à la question, mais j'ai écrit une explication plus détaillée, et vous proposer une solution sur ce blog. Fondamentalement, le problème est dans DataOutputStream, car il limite l'écriture de la Chaîne de 64 ko. Il y a d'autres solutions possibles à l'étape par la question, que certains travaillent sans casser le binaire format de données est l'utilisation de...
OriginalL'auteur István