Как определить кодировку строки в Java?

Пользователь

от richard , в категории: Java , 2 года назад

Как определить кодировку строки в Java?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от linnea , 2 года назад

@richard 

В Java нет специального метода для определения кодировки строки. Однако, если у вас есть строка, которая была закодирована в какой-то кодировке, вы можете попытаться декодировать ее с помощью различных кодировок и проверить, какая из них дает корректный результат.


Например, вот как это можно сделать с помощью класса CharsetDecoder:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
String s = "...";

// Попробуем декодировать строку с помощью различных кодировок
for (String encoding : new String[] {"UTF-8", "Windows-1251", "ISO-8859-1"}) {
    try {
        CharsetDecoder decoder = Charset.forName(encoding).newDecoder();
        CharBuffer buffer = decoder.decode(ByteBuffer.wrap(s.getBytes()));
        System.out.println("Decoded using " + encoding + ": " + buffer.toString());
    } catch (Exception e) {
        System.out.println("Failed to decode using " + encoding);
    }
}


В этом примере мы перебираем три различные кодировки (UTF-8, Windows-1251 и ISO-8859-1) и пытаемся декодировать строку s с помощью каждой из них. Если декодирование прошло успешно, мы выводим сообщение с указ

Пользователь

от lori_jast , год назад

@richard 

В Java можно определить кодировку строки, используя класс CharsetDetector из библиотеки juniversalchardet.


Вот пример кода, который позволяет определить кодировку строки:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import com.ibm.icu.text.CharsetDetector;
import com.ibm.icu.text.CharsetMatch;

public class EncodingDetector {
    public static void main(String[] args) {
        String text = "Пример строки";
        
        CharsetDetector detector = new CharsetDetector();
        detector.setText(text.getBytes());
        
        CharsetMatch match = detector.detect();
        String charset = match.getName();
        
        System.out.println("Кодировка строки: " + charset);
    }
}


В данном примере мы используем метод setText() для установки текста, который нужно проанализировать. Затем вызываем метод detect(), который возвращает объект CharsetMatch, содержащий информацию о распознанной кодировке. Метод getName() возвращает название кодировки. В данном примере результат будет "UTF-8", так как строка содержит символы, которые не встречаются в других кодировках.


Примечание: Для использования библиотеки juniversalchardet, вы должны добавить ее в свой проект.

Пользователь

от vicenta_kertzmann , год назад

@richard 

В Java существует несколько способов определить кодировку строки. Ниже приведены некоторые из них:

  1. Использование класса CharsetDetector из библиотеки Apache Tika:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import org.apache.tika.detect.EncodingDetector;
import org.apache.tika.detect.EncodingDetectorImpl;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.sax.BodyContentHandler;

public class CharsetDetectorExample {
    public static void main(String[] args) throws Exception {
        String text = "Пример строки";
        
        // Создаем экземпляр детектора кодировки
        EncodingDetector detector = new EncodingDetectorImpl();

        // Создаем экземпляр парсера Apache Tika
        AutoDetectParser parser = new AutoDetectParser(detector);
        
        // Используем BodyContentHandler для получения содержимого документа
        BodyContentHandler handler = new BodyContentHandler();
        
        // Создаем объект метаданных
        Metadata metadata = new Metadata();
        
        // Передаем строку для определения кодировки
        ByteArrayInputStream inputStream = new ByteArrayInputStream(text.getBytes());
        
        // Обрабатываем документ и получаем кодировку
        parser.parse(inputStream, handler, metadata);
        String encoding = metadata.get("Content-Encoding");
        
        System.out.println("Кодировка строки: " + encoding);
    }
}


  1. Использование класса Charset и метода guessEncoding() из библиотеки juniversalchardet:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import com.googlecode.juniversalchardet.UniversalDetector;

public class CharsetDetectorExample {
    public static void main(String[] args) {
        String text = "Пример строки";
        
        // Создаем экземпляр детектора кодировки
        UniversalDetector detector = new UniversalDetector(null);
        
        // Передаем строку для определения кодировки
        detector.handleData(text.getBytes(), 0, text.getBytes().length);
        
        // Завершаем определение кодировки
        detector.dataEnd();
        
        // Получаем определенную кодировку
        String encoding = detector.getDetectedCharset();
        
        System.out.println("Кодировка строки: " + encoding);
    }
}


  1. Использование класса Charset и методов forName() и decode():
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class CharsetDetectorExample {
    public static void main(String[] args) {
        String text = "Пример строки";
        
        // Массив возможных кодировок
        String[] charsets = {"UTF-8", "windows-1251", "ISO-8859-1", "UTF-16"};
        
        // Перебираем кодировки и проверяем, может ли текст быть декодирован с использованием текущей кодировки
        for (String charset : charsets) {
            Charset cs = Charset.forName(charset);
            try {
                cs.newDecoder().decode(ByteBuffer.wrap(text.getBytes()));
                System.out.println("Кодировка строки: " + charset);
                break;
            } catch (CharacterCodingException e) {
                // Кодировка не подходит для текущей строки
            }
        }
    }
}


В каждом из приведенных примеров была использована различная библиотека или функция для определения кодировки строки в Java. Вы можете выбрать наиболее подходящую для ваших потребностей.