У меня есть строка, которая возвращается парсером HTML Jericho и содержит некоторый русский текст. Согласно source.getEncoding()
и заголовку соответствующего HTML-файла, кодировка представляет собой Windows-1251.Как преобразовать текст Windows-1251 в нечто читаемое?
Как я могу преобразовать эту строку в нечто читаемое?
Я попытался это:
import java.io.UnsupportedEncodingException;
public class Program {
public void run() throws UnsupportedEncodingException {
final String windows1251String = getWindows1251String();
System.out.println("String (Windows-1251): " + windows1251String);
final String readableString = convertString(windows1251String);
System.out.println("String (converted): " + readableString);
}
private String convertString(String windows1251String) throws UnsupportedEncodingException {
return new String(windows1251String.getBytes(), "UTF-8");
}
private String getWindows1251String() {
final byte[] bytes = new byte[] {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32};
return new String(bytes);
}
public static void main(final String[] args) throws UnsupportedEncodingException {
final Program program = new Program();
program.run();
}
}
Переменная bytes
содержит данные, приведенные в моем отладчика, это результат net.htmlparser.jericho.Element.getContent().toString().getBytes()
. Я просто копировал и вставлял этот массив здесь.
Это не работает - readableString
содержит мусор.
Как это исправить, т.е. е. убедитесь, что строка Windows-1251 правильно декодирована?
Update 1 (30.07.2015 12:45 MSK): При изменении кодировки в вызове в convertString
к Windows-1251
, ничего не меняется. См. Снимок экрана ниже.
Update 2: Еще одна попытка:
Update 3 (30.07.2015 14:38): тексты, которые мне нужно декодировать соответствуют текстам в раскрывающемся списке, показанном ниже.
обновление 4 (30.07.2015 14:41): Детектор кодирования (код ниже) говорит, что кодирование не Windows-1251
, но UTF-8
.
public static String guessEncoding(byte[] bytes) {
String DEFAULT_ENCODING = "UTF-8";
org.mozilla.universalchardet.UniversalDetector detector =
new org.mozilla.universalchardet.UniversalDetector(null);
detector.handleData(bytes, 0, bytes.length);
detector.dataEnd();
String encoding = detector.getDetectedCharset();
System.out.println("Detected encoding: " + encoding);
detector.reset();
if (encoding == null) {
encoding = DEFAULT_ENCODING;
}
return encoding;
}
Вы попробовали 'new String (bytes," Windows-1251 ")'? –
Я подозреваю, что ваш конструктор String() должен указать кодировку, используемую в вашем массиве байтов, в противном случае вы подпадаете под JVM-кодирование для вашей среды –
@FlorianSchaetz Да, см. Обновление 1. –