powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение строки порциями и объединение результата
14 сообщений из 14, страница 1 из 1
Чтение строки порциями и объединение результата
    #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
Чтение строки порциями и объединение результата
    #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
Чтение строки порциями и объединение результата
    #39932015
iJava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen


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

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

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

Где?

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

Где?

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


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

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


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

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

я имел ввиду бит а не байт) простите великодушно)
...
Рейтинг: 0 / 0
Чтение строки порциями и объединение результата
    #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
Чтение строки порциями и объединение результата
    #39932459
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
я имел ввиду бит а не байт) простите великодушно)
С количеством бит на байт определились вскоре после изобретения тыртырнетов.
Древний RFC на FTP ещё рассматривает системы с разной разрядностью, а всё более-менее современное, если требуется, явно оговаривает "clear eight bit" и пользуется терминами октет и байт как синонимами.
...
Рейтинг: 0 / 0
Чтение строки порциями и объединение результата
    #39933147
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
Basil A. Sidorov
пропущено...
Опять мимо - от одного до четырёх байт на кодовую точку.

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

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

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

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


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