Fichier encodé en UCS-2 Little Endian rapports 2x trop de lignes de Java
J'ai été le traitement de plusieurs fichiers txt avec un programme Java simple, et la première étape de mon processus est de compter les lignes de chaque fichier:
int count = 0;
br = new BufferedReader(new FileReader(myFile)); //myFile is the txt file in question
while (br.readLine() != null) {
count++;
}
Pour l'un de mes fichiers, Java a été comptage exactement deux fois autant de lignes qu'il y avait vraiment! Cela a été source de confusion m'a beaucoup au premier abord. J'ai ouvert chaque fichier dans Notepad++ et pouvait voir que le mal de comptage le fichier se termine chaque ligne exactement de la même manière que les autres fichiers, avec un CR et LF. J'ai fait un peu plus de fouiller et remarqué que tous mes "ok" les fichiers ont été encodé en ANSI, et le seul problème de fichier est encodé en UCS-2 Little Endian (qui je n'en sais rien). J'ai eu ces fichiers ailleurs, donc je n'ai aucune idée de pourquoi l'un a été codé de cette façon, mais bien sûr, la mise à la norme ANSI résolu le problème.
Mais maintenant, la curiosité reste. Pourquoi le codage provoquant une double ligne du rapport de dépouillement?
Merci!
Il serait vraiment utile si vous pouviez dire ce qui est dans le "bla bla" étant donné qu'il est possile d'où l'erreur est...
Bon commentaire. À partir de la documentation java: Lit une ligne de texte. Une ligne est considérée comme terminée par un saut de ligne ('\n'), un retour chariot ('\r'), ou un retour chariot suivi immédiatement par un saut de ligne. j'ai remarqué que si j'essaie de sortie de ce qui est lu à partir de l'UCS-2 fichier encodé, c'sorties brouillé la boîte de caractère au lieu de la CR.
UCS-2 est un codage similaire (et prédécesseur) de l'UTF-16
Bon point. J'ai mis à jour l'OP.
OriginalL'auteur The111 | 2012-04-09
Vous devez vous connecter pour publier un commentaire.
Simple: si vous appliquez le mauvais encodage lors de la lecture de l'UCS-2 (ou UTF-16) texte (par exemple, la norme ANSI, ou toutes les 8 bits de codage), puis chaque deuxième personnage est un 0x0. Ensuite, cela casse le CR-LF CR-0-LF, qui est considéré comme deux changements de ligne (pour le CR et un pour LF).
0x0
censé afficher sur la console?Il n'a pas lu UCS-2, qui est le point. Si vous spécifiez le bon encodage pour lire le fichier, puis l'écrire avec le codage ANSI (ISO 8859-1), vous devez alors effectuer une conversion comme, manuellement, vous l'avez fait avec votre éditeur.
Je ne suis pas sûr de savoir comment le codage ANSI lit 0x0 personnages, ceux qui sont un peu spécial de toute façon depuis qu'ils sont utilisés comme indicateurs de fin de chaînes C et donc généralement pas utilisé dans le texte ordinaire. Cela dit, je ne suis pas sûr de ce que tu veux dire avec "quand il sort un enregistrement de chaque personnage, on lisait", est ce code qui calcule les statistiques des personnages de lire?
Notepad++ serait probablement montrer comme NUL s'il a été en utilisant le mauvais encodage de lire le texte, mais il est généralement assez intelligent pour détecter ce modèle et donc de passer à la correcte (UCS-2 ou, plus probablement, UTF-16) l'encodage. Est-il une avancée ouvrir dans Notepad++ où vous pouvez spécifier l'encodage à utiliser? Essayez ceci et spécifier la norme ANSI, vous devriez commencer à voir votre NULs alors.
Les encodages sont toujours amusant... je pense que la leçon que vous pouvez apprendre de cette est que vous devez toujours utilisé l'encodage correct lorsque vous traitez avec du texte, en particulier lors de la lecture du texte. C'est aussi pourquoi XML par exemple spécifie l'encodage au début du texte, de sorte que l'analyseur peut passer à l'encodage correct avant de tous les caractères spéciaux sont rencontrés. Qui plus quelques NOMENCLATURE de manutention et d'heuristiques pour le BOM-moins de fichiers permet une très bonne détection des courants de codages.
OriginalL'auteur Lucero
C'est le problème:
Qui va utiliser la plate-forme de codage par défaut. Ne pas le faire. Utilisation
où
encoding
est l'encodage approprié pour le fichier. Vous avez eu à utiliser le bon encodage, ou vous pourriez ne pas lire le fichier correctement. Malheureusement, bien sûr, qui compte sur vous sachant l'encodage...EDIT: pour répondre À la question de savoir pourquoi les lignes ont été comptés en double plutôt que de simplement "comment puis-je résoudre ce problème", voir Lucero réponse 🙂
Ce n'est pas le FileInputStream constructeur - FileInputStream traite avec binaire de données. C'est InputStreamReader, qui est la conversion d'un binaire
InputStream
à un texteReader
- donc, c'est le lieu naturel de mettre l'encodage.Alors que Jon a bien sûr le droit de corriger, je comprends que le question est pourquoi les lignes en double ont été comptés.
Ont ajouté une édition de référence à votre réponse à cet aspect des choses.
Soupir... réponse de revenir. Vous avez raison Lucero, vous n'avez plus directement répondre à ma Q... je pense que Jon juste me séduit plus de quelque chose, je ne m'y attendais pas. J'avais accepter à la fois de vos réponses, si je le pouvais. 🙂
OriginalL'auteur Jon Skeet