2009-02-23 10 views
3

J'ai quelques chaînes en Java (à l'origine d'une feuille Excel) que je suppose être dans la page de codes de Windows 1252. Je les veux convertis au format Unicode de Javas. Le fichier Excel a été analysé à l'aide du package JXL, au cas où cela serait important.Convertir de la page de code 1252 (Windows) en Java, en Java

Je vais clarifier: apparemment les chaînes obtenues à partir du fichier Excel ressemblent à peu près à une sorte d'Unicode.

WorkbookSettings ws = new WorkbookSettings(); 
ws.setCharacterSet(someInteger); 
Workbook workbook = Workbook.getWorkbook(new File(filename), ws); 
Sheet s = workbook.getSheet(sheet); 
row = s.getRow(4); 
String contents = row[0].getContents(); 

C'est là le contenu semble contenir unicode quelque chose, l'AAO sont des caractères multi-octets, tandis que les caractères ASCII sont d'un seul octet normaux. Ce n'est certainement pas Latin1. Si j'imprime la chaîne "contents" avec printLn et la redirige vers un fichier hello.txt, je trouve que la lettre "ö" est représentée avec deux octets, C3 B6 en hexadécimal. (195 et 179 en décimal.)

[modifier]

J'ai essayé les suggestions avec différents codepages etc donnés ci-dessous, la conversion de Cp1252 essayé etc. Il y avait une sorte de conversion, parce que je recevrais une autre genre de charabia à la place. Comme référence j'ai toujours imprimé une chaîne "ö" codée à la main dans le code source, pour vérifier qu'il n'y avait pas quelque chose de mal avec mon terminal ou des polices de caractères ou quoi que ce soit. Le "ö" tapé manuellement a toujours fonctionné.

[modifier]

J'ai aussi essayé WorkBookSettings comme suggéré dans les commentaires, mais je regardais dans le code pour JXL et characterSet semble être ignoré par l'analyse du code. Je pense que le code d'analyse ne regarde que l'encodage du fichier XLS.

+0

Le format Unicode de Java est UTF-16, iirc. – Powerlord

Répondre

5

WorkbookSettings ws = new WorkbookSettings();

ws.setEncoding ("CP1250");

J'ai travaillé pour moi.

+0

Merci! Cette astuce a sauvé ma journée! – ricardogobbo

+0

étonnamment travaillé! Merci. Également enregistré la moitié de ma journée. –

0

"windows-1252"/"Cp1252" n'est pas requis pour être supporté par JRE, mais par Sun (et probablement la plupart des autres). Voir le "Supported Encodings" dans votre documentation JDK. Ensuite, il suffit d'utiliser String, InputStreamReader ou similaire pour décoder les octets en caractères.

+0

ISO-88591-1 est tout à fait passable en tant que page de code Windows 1252 –

1

Lorsque Java analyse un fichier, il utilise un certain codage pour lire les octets sur le disque et créer des octets en mémoire. L'encodage par défaut varie d'une plateforme à l'autre. La représentation String interne de Java est déjà Unicode, donc si elle analyse le fichier avec le bon encodage, alors vous avez déjà terminé; il suffit d'écrire les données dans n'importe quel encodage que vous voulez.

Si vos chaînes semblent corrompues lorsque vous les regardez dans Java, c'est probablement parce que vous utilisez un mauvais encodage pour lire les données. Excel utilise probablement UTF-16 (Little-Endian, je pense) mais je m'attendrais à ce qu'une bibliothèque comme JXL soit capable de la détecter correctement. J'ai regardé les Javadocs pour JXL et ça ne fait rien avec les encodages de caractères. J'imagine qu'il détecte automatiquement les encodages comme il le faut.

Avez-vous juste besoin d'écrire les chaînes déjà chargées dans un fichier texte? Si oui, alors quelque chose comme ce qui suit fonctionnera:

String text = getCP1252Text(); // doesn't matter what the original encoding was, Java always uses Unicode 
FileOutputStream fos = new FileOutputStream("test.txt"); // Open file 
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-16"); // Specify character encoding 
PrintWriter pw = new PrintWriter(osw); 

pw.print(text); // repeat as needed 

pw.close(); // cleanup 
osw.close(); 
fos.close(); 

Si votre problème est autre chose s'il vous plaît modifier votre question et fournir plus de détails.

0
FileInputStream fis = new FileInputStream (yourFile); 
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"CP1250")); 

Et faire avec le lecteur tout ce que vous feriez directement avec le fichier.

1

Vous devez spécifier l'encodage correct lorsque le fichier est analysé - une fois que vous avez une chaîne Java basée sur un mauvais encodage, c'est trop tard.JXL vous permet de spécifier le codage en transmettant un objet WorkbookSettings à la méthode d'usine.

+0

Merci! Je vais essayer et j'espère revenir sur ce sujet pour que tout le monde puisse voir comment cela a fonctionné. –

0

Votre description indique que l'encodage est UTF-8 et que C3 B6 est le codage UTF-8 pour 'ö'.

2

Si aucune de la réponse ci-dessus résoudre le problème, l'affaire pourrait se faire comme ceci:

String myOutput = new String (myInput, "UTF-8"); 

Cela devrait decode la chaîne entrante, quel que soit son format.

Questions connexes