Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение строки порциями и объединение результата / 14 сообщений из 14, страница 1 из 1
27.02.2020, 18:17
    #39931918
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
Алгоритм:
1). Читаем данные из файла в буфер, размером например [1023] байта.
Код: java
1.
buffer = read bytes ...


2). Преобразуем его в строку в нужной кодировке.
Код: java
1.
String value = new String(buffer, "some encoding");


3). Выводим на экран.
4). Повторяем шаги 1-3 до конца файла.

Правильно ли я понимаю, что:
Разные кодировки используют различное количество байт для кодирования, и, если мы будем читать данные порциями, то для нашего алгоритма какой нибудь символ может "порваться". Если да, то как можно "стыковать" считываемые блоки (При условии, что кодировка может быть любой)?

Код: java
1.
2.
3.
[][] [][] [][] []  | [] [][] [][]
[ a] [b ] [c ] [ d |  ]  [e]  [f ]
{первая порция}    | {вторая порция}



Набросал небольшой код, который преобразует строку в набор байт в кодировке "UTF-16". А потом в цикле считывает байты от 0 до длины буфера-i и преобразовывает в строку:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

public class Newc {
	public static void main(String[] args) throws UnsupportedEncodingException {
		
		String str = "Hello"; // Utf-8 is default.
		
		byte[] buffer = str.getBytes(StandardCharsets.UTF_16);

		System.out.println("Buffer length: " +  buffer.length + " bytes");
		
		String s2=null;
		
		for (int i=0; i<buffer.length; i++) {	
			s2 = new String(buffer, 0, buffer.length-i, StandardCharsets.UTF_16);
			System.out.println(i + " - " + s2);
		}
	}
}


Результат:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Buffer length: 12 bytes
0 - Hello
1 - Hell&#65533;
2 - Hell
3 - Hel&#65533;
4 - Hel
5 - He&#65533;
6 - He
7 - H&#65533;
8 - H
9 - &#65533;
10 - 
11 - &#65533;


Результат, если читаем с i-того байта до конца:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Buffer length: 12 bytes
0 -  Hello
1 - &#65280;&#18432;&#25856;&#27648;&#27648;&#65533;
2 -  Hello
3 -  &#18432;&#25856;&#27648;&#27648;&#65533;
4 -   ello
5 -   &#25856;&#27648;&#27648;&#65533;
6 -    llo
7 -    &#27648;&#27648;&#65533;
8 -     lo
9 -      &#27648;&#65533;
10 -     o
11 -     &#65533;
...
Рейтинг: 0 / 0
27.02.2020, 18:31
    #39931927
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
faustgreen, нет нет все неправильно. Парсер Utf-8 - это конечный
автомат который помнит состояние в переходах между байтами.
И если ты неудачно порезал текстовый файл на куски то теоретически
ты разрезал 1 символ на 2 байта которые порознь не имеют смысла
и это состояние парсера надо передавать между блочными итерациями алгоритма.

Но чтобы ты не изобретал велосипед - в JDK уже есть коробоные механизмы которые работают.

Посмотри на следующий стек из компонентов.
Код: java
1.
2.
3.
4.
5.
6.
// Байты и массивы байтов
InputStream inputStream = new FileInputStream("file.txt");        
// Символы и массивы символов
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
// Строки
BufferedReader bufferedReader = new BufferedReader(reader);


Вот работай на уровне reader или bufferedReader.

Читать текстовый файл двоичными операциями это либо баловство либо просто студенческая
работа из серии "посмотреть что будет". В обоих случаях качество твоего кода на выходе будет
плохим т.к. тебе сложно поддержать на 100% спецификации Unicode. Их много и они нудные.
...
Рейтинг: 0 / 0
27.02.2020, 23:17
    #39932015
iJava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
faustgreen


Правильно ли я понимаю, что:

гуглить не пробовал ? ты правильно понимаешь - разный кодировки на то и разные )
где то на символ 2 байта ,где то 8
...
Рейтинг: 0 / 0
27.02.2020, 23:41
    #39932019
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
iJava
....где то 8

Где?
...
Рейтинг: 0 / 0
28.02.2020, 10:06
    #39932075
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
Leonid Kudryavtsev
iJava
....где то 8

Где?

UTF-8 например?
...
Рейтинг: 0 / 0
28.02.2020, 11:06
    #39932093
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
asv79
UTF-8 например?
Опять мимо - от одного до четырёх байт на кодовую точку.
...
Рейтинг: 0 / 0
28.02.2020, 11:54
    #39932111
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
asv79
Leonid Kudryavtsev
пропущено...

Где?

UTF-8 например?


Логично. В UTF-8 до 8 байт. Тогда в UTF-16 до 16 байт, а в UTF-32 - до 32 байт.
Гуглить не пробовал? (с)
...
Рейтинг: 0 / 0
28.02.2020, 12:11
    #39932117
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
Alexander A. Sak
asv79
пропущено...

UTF-8 например?


Логично. В UTF-8 до 8 байт. Тогда в UTF-16 до 16 байт, а в UTF-32 - до 32 байт.
Гуглить не пробовал? (с)

Твоя репутация подмочена.
...
Рейтинг: 0 / 0
28.02.2020, 20:54
    #39932410
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
Basil A. Sidorov
asv79
UTF-8 например?
Опять мимо - от одного до четырёх байт на кодовую точку.

я имел ввиду бит а не байт) простите великодушно)
...
Рейтинг: 0 / 0
28.02.2020, 21:25
    #39932416
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
asv79
я имел ввиду бит а не байт) простите великодушно)
прежде чем писать - гугли

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
UTF-8 является самосинхронизирующейся кодировкой: при потере одного байта последующие байты будут 
раскодированы корректно.

Текст, состоящий только из символов Юникода с номерами меньше 128, при записи в UTF-8 превращается в 
обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII
 с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт 
(реально только до 4 байт, поскольку использование кодов больше 2 21  не планируется), в которых первый байт 
всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.

Проще говоря, в формате UTF-8 символы латинского алфавита, знаки препинания и управляющие символы ASCII 
записываются кодами US-ASCII, a все остальные символы кодируются при помощи нескольких байтов со старшим
 битом 1. 
Подробнее:  http://wikireality.ru/wiki/UTF-8 
...
Рейтинг: 0 / 0
29.02.2020, 06:56
    #39932459
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
asv79
я имел ввиду бит а не байт) простите великодушно)
С количеством бит на байт определились вскоре после изобретения тыртырнетов.
Древний RFC на FTP ещё рассматривает системы с разной разрядностью, а всё более-менее современное, если требуется, явно оговаривает "clear eight bit" и пользуется терминами октет и байт как синонимами.
...
Рейтинг: 0 / 0
02.03.2020, 17:40
    #39933147
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
asv79
Basil A. Sidorov
пропущено...
Опять мимо - от одного до четырёх байт на кодовую точку.

я имел ввиду бит а не байт) простите великодушно)

но только в UTF-8 символы не 8 битами кодируются, опять мимо, в зависимости от самого символа, это может быть 8, 16 и 32 бита
...
Рейтинг: 0 / 0
02.03.2020, 17:58
    #39933158
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
Roman Mejtes
но только в UTF-8 символы не 8 битами кодируются, опять мимо, в зависимости от самого символа, это может быть 8, 16 и 32 бита
Только кодируются не символы, а кодовые точки или просто коды.
Код юникода, как ему и положено, является целым числом. Разрядность этого числа ограничена - двадцать один бит .
Сколько байт будет использовать кодировка юникода - зависит от кодировки.
Только всё это никак не меняет того простого факта, что "байт" и "октет" уже давно - синонимы.
...
Рейтинг: 0 / 0
03.03.2020, 11:26
    #39933391
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение строки порциями и объединение результата
Roman Mejtes

но только в UTF-8 символы не 8 битами кодируются, опять мимо, в зависимости от самого символа, это может быть 8, 16 и 32 бита

ты сам себе противоречишь)
не кодируются 8 битами,кодируются 8 ,16,32
и почему ты пропустил 3 октета ,тобишь 24 бита?
тоесть вы прямо сейчас поставил китайцев ,японцев ,грузинов и прочих людей перед выбором писать латиницей или забыть свой алфавит?)))
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение строки порциями и объединение результата / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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