Java convert windows 1251 to utf 8

Всем привет
Подскажите пожалуйста
Есть сайт в кодировке windows-1251
Делаю следующее
try {
URL u = new URL("sitename");
URLConnection conn = u.openConnection();
DataInputStream in = new DataInputStream ( conn.getInputStream ( ) ) ;
BufferedReader d = new BufferedReader(new InputStreamReader(in));
String str=null;
StringBuilder sb = new StringBuilder();
while( (str = d.readLine()) !=null)
{
sb.append(str);
}
str = sb.toString();
d.close();

WebView myWebView = (WebView) findViewById(R.id.webview);
int st=str.indexOf("block_title")-12;
int en=str.indexOf("block2")-18;
String res=str.substring(st,en);
String utf8String= new String(res.getBytes("UTF-8"), "windows-1251");;
String summary = "!"+utf8String+"";
myWebView.loadData(summary, "text/html", "utf-8");

и в WebView выходят каракули
подскажите как конвертнуть

Спасибо


  • Вопрос задан

  • 90265 просмотров

Вы из потока уже не в той кодировке читаете.
Надо создать правильный InputStreamReader:

InputStreamReader isr = new InputStreamReader(conn.getInputStream(), "windows-1251");
BufferedReader br = new BufferedReader(isr);

Пригласить эксперта

В Java кодировка по умолчанию UTF-8, поэтому когда вы пишите:

String utf8String= new String(res.getBytes("UTF-8"), "windows-1251");

Вы фактически переводите UTF-8 в windows-1251, а отображаете как UTF-8.
Вы можете легко проверить мою догадку воспользовавшись программой Штирлиц 4.0

Войдите, чтобы написать ответ


  • Показать ещё
    Загружается…

Минуточку внимания


Рейтинг 4.63/8:

Jake228

0 / 0 / 0

Регистрация: 26.05.2023

Сообщений: 4

26.05.2023, 12:05. Показов 1859. Ответов 7

Метки java ee, spring (Все метки)


Доброго времени суток!

Получаем ответ от банка в виде xml response.txt, парсим строку //response/pg_failure_description, видим что ответ закодирован. Кодировка в WINDOWS-1251. Пробую декодировать его в читаемый формат, чтобы записать в бд, делаю следующее (Java 11 на борту):

Java
1
2
byte[] bytes = encodedString.getBytes(Charset.forName("Windows-1251"));
                    return new String(bytes, StandardCharsets.UTF_8);

получаю ответ вот так — ?????�???? ?�???�???? ???�?�???�?�?� ?????�???????�????

Пробовал и через InputStream:

Java
1
2
3
4
5
6
7
8
byte[] bytes = encodedString.getBytes(Charset.forName("Windows-1251"));
                    InputStream in = new ByteArrayInputStream(bytes);
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
                    String inputLine;
                    while ((inputLine = reader.readLine()) != null) {
                        content.append(inputLine);
                    }
                    return content.toString();

результат такой же — ??�???� ?�?�?�?�????????????�???� ?? ???????�?�?�??? ????�??�?�?????, ???�??�?????�?? ?? ?�?�????

Видать с обычным пребразованием не обойтись, и нужно копать дальше, а вот куда дальше копать — не знаю. Раньше не работал с кодировками. Прошелся по stackOverFlow и не нашел ответа. Подскажите, куда дальше смотреть.



0



korvin_

4560 / 2756 / 489

Регистрация: 28.04.2012

Сообщений: 8,693

26.05.2023, 12:12

Сообщение от Jake228

Видать с обычным пребразованием не обойтись

Просто ты не понимешь, что делаешь.

Сообщение от Jake228

Java
1
2
byte[] bytes = encodedString.getBytes(Charset.forName("Windows-1251"));
return new String(bytes, StandardCharsets.UTF_8);

Что тут происходит, по-твоему? Прочитай документацию к getBytes.



0



0 / 0 / 0

Регистрация: 26.05.2023

Сообщений: 4

31.05.2023, 19:55

 [ТС]

Сообщение от korvin_

Что тут происходит, по-твоему? Прочитай документацию к getBytes

закодировал строку encodedString в последовательность байтов, используя кодировку Windows-1251. Потом возвращаю декодированный массив байтов в UTF_8 кодировке, который передаем в String для получения читаемую строку. Так не работает как я понял.

И теперь надо руками создать таблицу маппинга как здесь https://stackoverflow.com/ques… tf8-string ??



0



4560 / 2756 / 489

Регистрация: 28.04.2012

Сообщений: 8,693

31.05.2023, 21:05

Сообщение от Jake228

закодировал строку encodedString

Не закодировал.

Сообщение от Jake228

Потом возвращаю декодированный массив байтов в UTF_8 кодировке

Где ты его возвращаешь а UTF-8 кодировке? Ты его возвращаешь в Windows-1251 кодировке.

Сообщение от Jake228

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

А теперь ты этот массив байт в Win-1251 кодировке пытаешься интерпретировать как UTF-8.

Сообщение от Jake228

Нет, не надо.

Надо просто прочитать файл с указанием кодировки, в которой он закодирован, и всё.



0



Jake228

0 / 0 / 0

Регистрация: 26.05.2023

Сообщений: 4

31.05.2023, 21:53

 [ТС]

Сообщение от korvin_

Где ты его возвращаешь а UTF-8 кодировке? Ты его возвращаешь в Windows-1251 кодировке.

Java
1
return new String(bytes, StandardCharsets.UTF_8);

имел ввиду здесь возвращаю новую строку путем декодирования, разве нет?

Сообщение от korvin_

Надо просто прочитать файл с указанием кодировки, в которой он закодирован, и всё.

Java
1
2
byte[] bytes = text.getBytes(Charset.forName("Windows-1251"));
return new String(bytes, Charset.forName("Windows-1251"));

возвращает мне «?????µ???? ?¶???·???? ???»?°???µ?¶?° ?????µ???????µ????» если я правильно понял тебя



0



korvin_

4560 / 2756 / 489

Регистрация: 28.04.2012

Сообщений: 8,693

01.06.2023, 08:15

Сообщение было отмечено Jake228 как решение

Решение

Сообщение от Jake228

путем декодирования, разве нет?

Декодирования из UTF-8, но у тебя bytes — не UTF-8.

Сообщение от Jake228

если я правильно понял тебя

Не правильно.

Java
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
33
34
35
36
37
38
39
40
41
42
public final class TextDecoding {
 
    private static final String TEXT = "Мама мыла раму";
 
    public static void main(String[] args) throws IOException {
        System.out.println("T: " + TEXT);
        write();
 
        {   // A
            System.out.print("A: ");
            final var file = Paths.get("response.txt");
            final var content = Files.readString(file, Charset.forName("Windows-1251"));
            System.out.println(content);
        }
 
        {   // B
            System.out.print("B: ");
            final var file = Paths.get("response.txt");
            final var bytes = Files.readAllBytes(file);
            final var content = new String(bytes, Charset.forName("Windows-1251"));
            System.out.println(content);
        }
 
        {
            // C
            System.out.print("C: ");
            final var file = Paths.get("response.txt");
            try (var input = new BufferedReader(new InputStreamReader(Files.newInputStream(file), Charset.forName("Windows-1251")))) {
                final var content = new StringBuilder();
                String line;
                while ((line = input.readLine()) != null) {
                    content.append(line);
                }
                System.out.println(content.toString());
            }
        }
    }
 
    static void write() throws IOException {
        Files.writeString(Paths.get("response.txt"), TEXT, Charset.forName("Windows-1251"));
    }
}

Почитай, подумай.



1



Администратор

17930 / 14020 / 5351

Регистрация: 17.03.2014

Сообщений: 28,687

Записей в блоге: 1

01.06.2023, 12:01

Сообщение от Jake228

Получаем ответ от банка в виде xml response.txt,

Интересная ситуация. Кодировка XML файла указана как UTF-8, но текст не в UTF-8 и не в Windows-1251. Онлайн декодеры не могут справиться что намекает то что текст мог подвергнуться многократному неверному кодированию. Я бы начал с проверки кода получения ответа от банка. Возможно там есть ошибка.



0



0 / 0 / 0

Регистрация: 26.05.2023

Сообщений: 4

01.06.2023, 14:27

 [ТС]

Сообщение от OwenGlendower

но текст не в UTF-8 и не в Windows-1251. Онлайн декодеры не могут справиться что намекает то что текст мог подвергнуться многократному неверному кодированию

действительно в файле что-то не кодируемое прислали (достал из логов этот ответ), но есть и кодированные тексты, которые записались в БД, например «Ð’ремя жизни платежа превышено» или «Ð¡ÑƒÐ¼Ð¼Ð° превышает допустимый лимит на карте. »
Онлайн декодеры их «расшифровывают» нормально

Добавлено через 2 часа 8 минут

Сообщение от korvin_

Почитай, подумай

спасибо, понял твою суть

оказывается я тупанул, изначальная кодировка было в ISO_8859_1



0



Новые блоги и статьи

Все статьи  

Все блоги / 

Как использовать OAuth2 со Spring Security в Java

Javaican 14.05.2025

Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .

Анализ текста на Python с NLTK и Spacy

AI_Generated 14.05.2025

NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .

Реализация DI в PHP

Jason-Webb 13.05.2025

Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .

Обработка изображений в реальном времени на C# с OpenCV

stackOverflow 13.05.2025

Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .

POCO, ACE, Loki и другие продвинутые C++ библиотеки

NullReferenced 13.05.2025

В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .

Паттерны проектирования GoF на C#

UnmanagedCoder 13.05.2025

Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .

Создаем CLI приложение на Python с Prompt Toolkit

py-thonny 13.05.2025

Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .

Конвейеры ETL с Apache Airflow и Python

AI_Generated 13.05.2025

ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .

Выполнение асинхронных задач в Python с asyncio

py-thonny 12.05.2025

Современный мир программирования похож на оживлённый мегаполис – тысячи процессов одновременно требуют внимания, ресурсов и времени. В этих джунглях операций возникают ситуации, когда программа. . .

Работа с gRPC сервисами на C#

UnmanagedCoder 12.05.2025

gRPC (Google Remote Procedure Call) — открытый высокопроизводительный RPC-фреймворк, изначально разработанный компанией Google. Он отличается от традиционых REST-сервисов как минимум тем, что. . .

Наверх


This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters

Show hidden characters

public static String windows1251_to_utf8(String str_1251) throws Exception{
String str_utf8 = «»;
for(int i=0;i<str_1251.length();i++){
int c = Character.codePointAt(str_1251,i);
switch (c){
case 184: c=1105;break; //eo
case 168: c=1025;break; // capital EO
case 175: c=1198; break; //capital UE
case 191: c=1199; break; //ue
case 170: c=1256; break; // capital OE
case 186: c=1257; break; //oe
}
if (256>c && c>191) c=c+848;
switch(c) {
case 1111: c=1199;break; //u
case 1031: c= 1198; break; //capital U
case 1108: c=1257; break; //ou
case 1028: c=1256; break; //capital OU
}
str_utf8=str_utf8+(char)(c);
}
return str_utf8;
}

Ребят,нужно прочитать файл в одной кодировке Windows-1251 и записать в другой UTF-8. В чем у меня ошибка?

public class Solution {
    public static void main(String[] args) throws IOException {//Windows-1251 , UTF-8
        try(InputStream fin = new FileInputStream(args[0]); OutputStream fout = new FileOutputStream(args[1])){
              byte[] buffer = new byte[1000];
              int count;
              while (fin.available()>0){
                  count = fin.read(buffer);
                  String s = new String(buffer, "Windows-1251");
                  buffer = s.getBytes("UTF-8");
                  if(count!=-1) fout.write(buffer,0,count);
              }

        }catch (Exception e){}

    }
}

Welcome to our comprehensive guide on Windows-1251 encoding in Java! If you’re a developer looking to understand character encoding and how to effectively handle Cyrillic text in your Java applications, you’re in the right place. This page will provide you with essential insights into the Windows-1251 encoding standard, its importance for processing text in languages like Russian, and practical examples of how to implement it in your Java code. Whether you’re troubleshooting encoding issues or seeking to enhance your software’s internationalization capabilities, you’ll find valuable tips and techniques to elevate your programming skills. Let’s dive into the world of Windows-1251 encoding and unlock the potential of Java for multilingual applications!

Introduction to Windows-1251

Windows-1251 is a character encoding standard developed by Microsoft for the representation of Cyrillic scripts. It was designed to accommodate languages that use the Cyrillic alphabet, including Russian, Ukrainian, and Bulgarian. As a single-byte character encoding, Windows-1251 can represent 256 different characters, making it a popular choice for applications dealing with Eastern European languages. Despite the growing adoption of Unicode, Windows-1251 remains relevant in legacy systems and specific applications that require Cyrillic text processing.

In Java, encoding text with Windows-1251 is straightforward. The Java platform provides built-in support for various character encodings, including Windows-1251. To encode a string into a byte array using Windows-1251, you can use the getBytes method of the String class, specifying the encoding as an argument. Here’s an example:

import java.nio.charset.Charset;
public class EncodeExample {
    public static void main(String[] args) {
        String text = "Привет, мир!"; // "Hello, World!" in Russian
        byte[] encodedBytes = text.getBytes(Charset.forName("Windows-1251"));
        
        // Print the encoded byte array
        System.out.println("Encoded bytes: " + java.util.Arrays.toString(encodedBytes));
    }
}

This code snippet demonstrates how to convert a string containing Cyrillic characters into its Windows-1251 encoded byte representation. It’s essential to use the correct character set to avoid data corruption.

Decoding with Windows-1251 in Java

Decoding text encoded in Windows-1251 back into a Java String is equally simple. The String constructor can be utilized, which takes a byte array and the desired charset as parameters. Here’s how you can decode Windows-1251 encoded data:

import java.nio.charset.Charset;
public class DecodeExample {
    public static void main(String[] args) {
        byte[] encodedBytes = { -24, -112, -108, -24, -111, -100, -24, -113, -101, -24, -112, -116 }; // Example byte array
        String decodedText = new String(encodedBytes, Charset.forName("Windows-1251"));
        
        // Print the decoded string
        System.out.println("Decoded text: " + decodedText);
    }
}

In this example, we convert a byte array back into a string using Windows-1251 encoding. It’s crucial to ensure the byte array accurately represents the original text; otherwise, the output may contain garbled characters.

Advantages and Disadvantages of Windows-1251

Advantages

  1. Simplicity: Windows-1251 is easy to implement, especially in legacy systems where the character set is well-defined.
  2. Efficiency: Being a single-byte encoding, it can be more memory-efficient for applications that primarily deal with Cyrillic text compared to multi-byte encodings like UTF-8.

Disadvantages

  1. Limited Character Set: Windows-1251 only supports Cyrillic characters, which can be limiting for applications that require multilingual support.
  2. Obsolescence: As the Unicode standard gains traction, Windows-1251 is gradually becoming less common, leading to potential compatibility issues in modern applications.

Key Applications of Windows-1251

Windows-1251 is commonly used in various applications, particularly those involving legacy systems or specific Eastern European contexts. Key applications include:

  • Text Processing: Software that processes Cyrillic text, such as word processors and text editors, often utilizes Windows-1251 encoding.
  • Databases: Some databases may still store data in Windows-1251, especially if they were developed before the widespread adoption of Unicode.
  • Web Development: Older websites that cater to Russian or other Cyrillic language audiences may still use Windows-1251 encoding for their content.

Popular Frameworks and Tools for Windows-1251

Several frameworks and tools support Windows-1251 encoding, making it easier for developers to work with Cyrillic text. Some of the most popular include:

  • Apache Commons Text: This library provides utilities for encoding and decoding various character sets, including Windows-1251.
  • Java’s Built-in Libraries: The standard Java libraries offer robust support for Windows-1251 through the Charset class, enabling seamless encoding and decoding.
  • Spring Framework: This popular Java framework supports various character encodings, allowing developers to easily integrate Windows-1251 in web applications.

In conclusion, while Windows-1251 may not be the most modern encoding standard, it still holds significance in specific use cases, especially when dealing with Cyrillic text in Java applications. Understanding how to encode and decode using this standard is essential for developers working in Eastern European contexts.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Delivery optimization что за папка windows 10 можно ли удалить
  • Как на компьютере создать 2 пользователя на компьютере windows
  • Clean windows update files
  • Входное устройство не установлено windows 10 звук
  • Режим планшета windows 10 что это