Преобразование из кодовой страницы 1252 (Windows) в Java, в Java - PullRequest
3 голосов
/ 23 февраля 2009

У меня есть несколько строк на Java (изначально из листа Excel), которые, как я предполагаю, находятся в кодовой странице Windows 1252. Я хочу, чтобы они были преобразованы в собственный формат Unicode Javas. Файл Excel был проанализирован с использованием пакета JXL, в случае, если это имеет значение.

Я уточню: очевидно, строки, полученные из файла Excel, выглядят так, как будто это уже какой-то юникод.

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();

Здесь содержимое, похоже, содержит что-то в юникоде, символы являются многобайтовыми, а символы ASCII - обычными однобайтовыми символами. Это определенно не латынь1. Если я распечатаю строку «содержимое» с помощью printLn и перенаправлю ее в файл hello.txt, я обнаружу, что буква «ö» представлена ​​двумя байтами, C3 B6 в шестнадцатеричном формате. (195 и 179 в десятичном виде.)

[править]

Я попробовал предложения с различными кодовыми страницами и т. Д., Приведенные ниже, попытался конвертировать из Cp1252 и т. Д. Было какое-то преобразование, потому что вместо этого я получил бы какой-то другой бред. Для справки я всегда печатал строку «ö», закодированную в исходном коде, чтобы убедиться, что с моим терминалом, гарнитурами или чем-то еще не было ничего плохого. «Ö», введенное вручную, всегда работало.

[править]

Я также попробовал WorkBookSettings, как это было предложено в комментариях, но я искал код для JXL, и набор символов, похоже, игнорируется при разборе кода. Я думаю, что код синтаксического анализа просто смотрит на то, в какой кодировке должен быть файл XLS.

Ответы [ 7 ]

5 голосов
/ 21 апреля 2009

WorkbookSettings ws = new WorkbookSettings ();

ws.setEncoding ( "CP1250");

работал для меня.

2 голосов
/ 23 августа 2010

Если ни один из приведенных выше ответов не решит проблему, трюк может быть выполнен следующим образом:

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

Это должно декодировать входящую строку, независимо от ее формата.

1 голос
/ 24 февраля 2009

Вам необходимо указать правильную кодировку при анализе файла - если у вас есть строка Java, основанная на неправильной кодировке, будет слишком поздно.

JXL позволяет указать кодировку, передав объект WorkbookSettings фабричному методу.

1 голос
/ 23 февраля 2009

Когда Java анализирует файл, он использует некоторую кодировку для чтения байтов на диске и создания байтов в памяти. Кодировка по умолчанию варьируется от платформы к платформе. Внутреннее строковое представление Java уже является Unicode, поэтому, если он анализирует файл с правильной кодировкой, то вы уже сделали; просто запишите данные в любой кодировке.

Если ваши строки выглядят испорченными, когда вы смотрите на них в Java, это возможно потому, что вы используете неправильную кодировку для чтения данных. В Excel, вероятно, используется UTF-16 (я думаю, Little-Endian), но я ожидаю, что такая библиотека, как JXL, сможет его правильно определить. Я посмотрел на Javadocs для JXL, и он ничего не делает с кодировками символов. Я предполагаю, что он автоматически обнаруживает любые кодировки, как это необходимо.

Вам просто нужно записать уже загруженные строки в текстовый файл? Если это так, то будет работать что-то вроде следующего:

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();

Если ваша проблема в чем-то другом, отредактируйте ваш вопрос и предоставьте более подробную информацию.

0 голосов
/ 07 января 2010

Ваше описание указывает на то, что кодировка UTF-8, и действительно C3 B6 является кодировкой UTF-8 для 'ö'.

0 голосов
/ 23 февраля 2009
FileInputStream fis = new FileInputStream (yourFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"CP1250"));

И делайте с ридером все, что вы делаете напрямую с файлом.

0 голосов
/ 23 февраля 2009

"windows-1252" / "Cp1252" не обязательно должен поддерживаться JRE, но поддерживается Sun (и, вероятно, большинством других). См. «Поддерживаемые кодировки» в документации JDK. Тогда нужно просто использовать String, InputStreamReader или аналогичные для декодирования байтов в символы.

...