powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Про кодировку из cp866 в utf8
25 сообщений из 77, страница 1 из 4
Про кодировку из cp866 в utf8
    #39466975
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть файл в непонятной кодировке - блонот показывает нормальный текст только шрифтом terminal.
читаю этот файл так

Код: java
1.
2.
3.
4.
5.
6.
7.
try (FileInputStream fin = new FileInputStream("xxx.txt")) {
            byte[] buffer = new byte[fin.available()];
            fin.read(buffer, 0, fin.available());
            sss = new String(buffer, "cp866");
          } catch (IOException ex) {
            ex.printStackTrace();
        }


записываю так
Код: java
1.
2.
3.
4.
5.
try (FileWriter writer = new FileWriter("xxx_.txt", false)) {
            writer.write(sss);
        } catch (Exception e) {
              ex.printStackTrace();
        }


блокнот читает новый файл нормально, размер файла остался прежним.
т.е. однобайтовая кодировка.
как получить UTF-8 ?
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39466985
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По умолчанию писатель использует системную кодировку, которая (в данном конкретном случае) - windows-1251.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39466997
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Приаттач файл.
2. FileReader, Files и прочие API почему не используем? Куча кода для задачи, которая со всякими Apache Commons решается в один метод.
3. UTF-8 это однобайтовая кодировка в ASCII диапазоне. Откуда уверенность что FileWriter по-умолчанию будет писать именно в ней?

Блин, первым же тыком:
https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html
Один метод на чтение, другой на запись. Всё!
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467001
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
с записанным понятно.
в какой кодировке sss ?
если java использует по умолчанию utf-8 , то и sss должна быть уже в utf-8 ?
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467002
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz2. FileReader, Files и прочие API почему не используем? Куча кода для задачи, которая со всякими Apache Commons решается в один метод.
нерепробовал кучу методов, но получилась фигня..
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467021
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадянерепробовал
очепятка - перепробовал
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467024
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесли java использует по умолчанию utf-8
Java не использует по-умолчанию utf-8. Откуда это заблуждение - вопрос открытый.

вадя, то и sss должна быть уже в utf-8 ?
Строка не имеет кодировки. Это основное заблуждение обнажающее непонимание "кодировок".

Строка, с точки зрения Java, это текст. У текста нет кодировок.
Кодировка это представление текста в байтах. Поэтому она важна при чтении и записи файлов.
Представление строки в виде какой-либо кодировки в оперативной памяти отношения к пробелеме не имеет, поэтому его приплетать не нужно. Хотя многие этим злоупотребляют.
Кодировка по-умолчанию находится в системном свойстве file.encoding. Как уже верно заметили выше, под русской виндой, это, обычно, cp1251. Можно запустить программу с параметром -Dfile.encoding=UTF-8 и получить другой файл.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467027
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадянерепробовал кучу методов, но получилась фигня..
Код: java
1.
2.
String text = FileUtils.readFileToString(file, "cp866");
FileUtils.writeStringToFile(anotherFile, "UTF-8");
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467103
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczСтрока не имеет кодировки. Это основное заблуждение обнажающее непонимание "кодировок".
длина строки из 10символов - 10 или 20 байт?
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467109
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесли java использует по умолчанию utf-8Откуда ж вы такие берётесь ...
Текущая реализация строк - массив char-ов. Со всякими выкрутасами в виде модифицированного UTF 16 и прозрачным преобразованием во "внешнюю" кодировку.
UTF16 потому, что char , модифицированная - для обратной совместимости с версиями, использовавшими только BMP.
Умолчание "внешней" кодировки зависит не только от системы, но и от разработчика.
IBM J9, например, раздельно отслеживает "файловую" и "консольную" кодировки.
В последних Oracle JRE есть похожий механизм, но реализован иначе.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467116
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадядлина строки из 10символов - 10 или 20 байт?
Длина строки - 10 символов.
Количество байт зависит от кодировки, самих символов и то что именно мы называем символом.
Рекомендую к изучению:
https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467118
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя, для русского языка объективно существуют пара-тройка кодировок которые могут
быть использованы. Это win-1251, koi8-r, cp866. Это - однобайтные. Их легко глазом увидеть
если открыть в hex-редакторе. Тоесть вариантов как-бе не очень много.

(кстати я в скобках замечу что наличие hex-редактора на рабочем столе подчеркивает
уровень seniority)

Многобайтные (их немного) utf-16 видны в hex-редакторе как ярко выраженные чередования
полос нулей 00 и кодов латиницы. А для русских букв коды будут соотв в диапазоне
и будут перекрывать пару байтов.

Для плавающих кодировок типа utf-8 латиница видна без изменений, а кириллица соотв
раздвигается до 2х байтов с префиксным кодированием.

Прочие многобайтные типа utf-32 где-то существуют в галлактике но это экзотика.

Сущетсвует также протокол передачи т.н. BOM-заголовка перед текстовым файлом
который может быть маркером многобайтной кодировки но ЕМНИП он не обязательно
соблюдается редакторами.

Догадываюсь что сейчас в топик набегут знатоки кодовых точек и расширенных кодировок Unicode
но тот базовый набор знаний который нужен для повседневной работы я уже дал.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467122
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovОткуда ж вы такие берётесь ...
дак от туда, что нет четкой трактовки.
char - сколько байт?
если я так читаю
String text = FileUtils.readFileToString(file, "cp866");
что из себя представляет каждый символ из text?
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467129
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonно тот базовый набор знаний который нужен для повседневной работы я уже дал.База повседневной работы - документация о способах задания кодировок при вводе-выводе, включая преобразования String <-> byte[].
То, что вы "дали" лучше вообще не знать - неполные знания могут быть хуже отсутствующих.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467131
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяchar - сколько байт?
если я так читаю
String text = FileUtils.readFileToString(file, "cp866");
что из себя представляет каждый символ из text?
В середине 20-го века (на заре кибернетики) char действительно был байтом (8 bit).

В парадигме Java char по сути является синонимом 16-битного целого числа.
Тоесть маппинг уже невозможен.

Текстовый (*.txt) файл который лежит на диске изначально не имеет никакой кодировки.
Детектирование его кодировки - это наша головная боль. Опять-же это все наследие 20-го века.

Вот если взять xml - то его спека однозначно и жестко определяет хедер
где есть encoding="" и символьное стандартное описание семантики байтов
которые лежат сразу после хедера.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467139
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяchar - сколько байт?Написано в любом учебнике - 16 бит. Фиксировано, как и любой примитивный тип Java.если я так читаю
String text = FileUtils.readFileToString(file, "cp866");
что из себя представляет каждый символ из text?Неизвестно, т.к. String - базовый (и обязательный) тип Java SE API. "Без объявления войны" его реализацию, конечно не поменяют, но если изменят - вы об этом можете и не узнать.
Кодировка есть у байтов, которые читаются/пишутся из/в потоки ввода/вывода. Именно кодировка позволяет интерпретировать последовательность байт тем или иным способом.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467141
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот если взять xml - то его спека однозначно и жестко определяет хедерДа неужели?
Допустим, что никто ничего не накосячил. Вы знаете способ без ошибок прочитать заголовок xml-файл с кодировкой UTF16LE/UTF16BE?
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467144
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

вот уже идут разночтения
maytonЭто win-1251, koi8-r, cp866. Это - однобайтные.
Blazkowicz3. UTF-8 это однобайтовая кодировка в ASCII диапазоне.
mayton пропустили кодировку или Blazkowicz ошибся?
maytonДля плавающих кодировок типа utf-8 латиница видна без изменений, а кириллица соотв
раздвигается до 2х байтов с префиксным кодированием.
BlazkowiczСтрока, с точки зрения Java, это текст. У текста нет кодировок.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467150
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадявот уже идут разночтения

Или просто кто-то не внимательно читает. Разночтений нет. Одно и то же разными словами.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467154
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадявот уже идут разночтенияНет никаких разночтений - в диапазоне кодов от 1 до 127 (US-ASCII) UTF8 кодирует каждый символ одним байтом. Составных символов в US-ASCII нет, поэтому US-ASCII == UTF8. Но не наоборот :)
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467158
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНеизвестно, т.к. String - базовый (и обязательный) тип Java SE API.
поэтому и возникают вопросы .

maytonТекстовый (*.txt) файл который лежит на диске изначально не имеет никакой кодировки.
согласен.
отсюда вопрос - как эти байты отображать ?
вот такой таким 20543921 , блокнот читает и понимает нормально.
если смотреть в hex - просто произошла подмена значений байтов.
кодировка ?
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467163
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНет никаких разночтений - в диапазоне кодов от 1 до 127 (US-ASCII) UTF8 кодирует каждый символ одним байтом. Составных символов в US-ASCII нет, поэтому US-ASCII == UTF8. Но не наоборот :)
вопрос
авторесли Неизвестно, т.к. String - базовый (и обязательный) тип Java SE API.
что будет если я в строке прочитанной таким образом
Код: java
1.
2.
3.
4.
5.
6.
7.
try (FileInputStream fin = new FileInputStream("xxx.txt")) {
            byte[] buffer = new byte[fin.available()];
            fin.read(buffer, 0, fin.available());
            sss = new String(buffer, "cp866");
          } catch (IOException ex) {
            ex.printStackTrace();
        }


начну искаить , к примеру , строку , набранную в ide-кудакторе , лалалал
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467165
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяmaytonТекстовый (*.txt) файл который лежит на диске изначально не имеет никакой кодировки.согласен.А зря.
Виндовый блокнот умеет ANSI, UTF16BOM, UTF8BOM.
Не очень понимаю, что мешало добавить ещё и OEM, но факт остаётся фактом - текст представляется последовательностью байт в разной кодировке.отсюда вопрос - как эти байты отображать ?По ситуации.
Если кодировка дана извне - просто читаем доку.
Если кодировка неизвестна - ищем алгоритм(ы) определения кодировок для конкретного языка или языков. Ну или кидаем исключения/спрашиваем пользователя.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467168
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяначну искаить , к примеру , строку , набранную в ide-кудакторе , лалалалЗависит от настроек редактора, но шанс, что это будет CP866 - практически нулевой.
...
Рейтинг: 0 / 0
Про кодировку из cp866 в utf8
    #39467169
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВиндовый блокнот умеет ANSI, UTF16BOM, UTF8BOM.
Не очень понимаю, что мешало добавить ещё и OEM,
он и OEM может отобразить - если выставить шрифт terminal.
Basil A. SidorovЕсли кодировка неизвестна - ищем алгоритм(ы) определения кодировок для конкретного языка или языков. Ну или кидаем исключения/спрашиваем пользователя.
вот и и спрашиваю...
круг замкнулся..
...
Рейтинг: 0 / 0
25 сообщений из 77, страница 1 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Про кодировку из cp866 в utf8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]