Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Про кодировку из cp866 в utf8 / 25 сообщений из 77, страница 1 из 4
06.06.2017, 16:07
    #39466975
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про кодировку из cp866 в utf8
есть файл в непонятной кодировке - блонот показывает нормальный текст только шрифтом 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
06.06.2017, 16:11
    #39466985
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про кодировку из cp866 в utf8
По умолчанию писатель использует системную кодировку, которая (в данном конкретном случае) - windows-1251.
...
Рейтинг: 0 / 0
06.06.2017, 16:17
    #39466997
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про кодировку из cp866 в utf8
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
06.06.2017, 16:19
    #39467001
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про кодировку из cp866 в utf8
Basil A. Sidorov,
с записанным понятно.
в какой кодировке sss ?
если java использует по умолчанию utf-8 , то и sss должна быть уже в utf-8 ?
...
Рейтинг: 0 / 0
06.06.2017, 16:21
    #39467002
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про кодировку из cp866 в utf8
Blazkowicz2. FileReader, Files и прочие API почему не используем? Куча кода для задачи, которая со всякими Apache Commons решается в один метод.
нерепробовал кучу методов, но получилась фигня..
...
Рейтинг: 0 / 0
06.06.2017, 16:35
    #39467021
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про кодировку из cp866 в utf8
вадянерепробовал
очепятка - перепробовал
...
Рейтинг: 0 / 0
06.06.2017, 16:39
    #39467024
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про кодировку из cp866 в utf8
вадяесли java использует по умолчанию utf-8
Java не использует по-умолчанию utf-8. Откуда это заблуждение - вопрос открытый.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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