Всем привет
Подскажите пожалуйста
Есть сайт в кодировке 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
Войдите, чтобы написать ответ
-
Показать ещё
Загружается…
Минуточку внимания
|
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 на борту):
получаю ответ вот так — ?????�???? ?�???�???? ???�?�???�?�?� ?????�???????�???? Пробовал и через InputStream:
результат такой же — ??�???� ?�?�?�?�????????????�???� ?? ???????�?�?�??? ????�??�?�?????, ???�??�?????�?? ?? ?�?�???? Видать с обычным пребразованием не обойтись, и нужно копать дальше, а вот куда дальше копать — не знаю. Раньше не работал с кодировками. Прошелся по stackOverFlow и не нашел ответа. Подскажите, куда дальше смотреть.
0 |
korvin_ 4560 / 2756 / 489 Регистрация: 28.04.2012 Сообщений: 8,693 |
||||
26.05.2023, 12:12 |
||||
Сообщение от Jake228 Видать с обычным пребразованием не обойтись Просто ты не понимешь, что делаешь. Сообщение от Jake228
Что тут происходит, по-твоему? Прочитай документацию к 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 кодировке.
имел ввиду здесь возвращаю новую строку путем декодирования, разве нет? Сообщение от korvin_ Надо просто прочитать файл с указанием кодировки, в которой он закодирован, и всё.
возвращает мне «?????µ???? ?¶???·???? ???»?°???µ?¶?° ?????µ???????µ????» если я правильно понял тебя
0 |
korvin_ 4560 / 2756 / 489 Регистрация: 28.04.2012 Сообщений: 8,693 |
||||
01.06.2023, 08:15 |
||||
Сообщение было отмечено Jake228 как решение РешениеСообщение от Jake228 путем декодирования, разве нет? Декодирования из UTF-8, но у тебя bytes — не UTF-8. Сообщение от Jake228 если я правильно понял тебя Не правильно.
Почитай, подумай.
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
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
- Simplicity: Windows-1251 is easy to implement, especially in legacy systems where the character set is well-defined.
- 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
- Limited Character Set: Windows-1251 only supports Cyrillic characters, which can be limiting for applications that require multilingual support.
- 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.