The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Как выдрать из UTF-8 текста указанное количество символов"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на рабочей станции (Unicode, кодировки / FreeBSD)
Изначальное сообщение [ Отслеживать ]

"Как выдрать из UTF-8 текста указанное количество символов"  +/
Сообщение от DHCPep (?), 06-Дек-19, 21:55 
Здравствуйте!

У меня такая задача возникла. Есть файл текстовый, в UTF-8.
И я хочу из него вывести произвольный кусок текста. Т.е. если в файле N символов (не байт!), я хочу получить функцию substr(txt, K, M), где K<M<=N

Всё это хочу сделать в консоли. Пробовал cut, он естественно не работает, т.к. cut -cK-M  конечно считаем байтами. А у меня utf-8.

Есть ли возможность получить результат как cut но для символов, а не байт?
Желательно не внешними утилитами а из стандартного набора.

Спасибо!

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Как выдрать из UTF-8 текста указанное количество символов"  +1 +/
Сообщение от anon1999 (?), 06-Дек-19, 23:01 
>[оверквотинг удален]
> У меня такая задача возникла. Есть файл текстовый, в UTF-8.
> И я хочу из него вывести произвольный кусок текста. Т.е. если в
> файле N символов (не байт!), я хочу получить функцию substr(txt, K,
> M), где K<M<=N
> Всё это хочу сделать в консоли. Пробовал cut, он естественно не работает,
> т.к. cut -cK-M  конечно считаем байтами. А у меня utf-8.
> Есть ли возможность получить результат как cut но для символов, а не
> байт?
> Желательно не внешними утилитами а из стандартного набора.
> Спасибо!

Может, сначала стоит перекодировать строку из UTF-8 в кодировку с фиксированной шириной символа,
а потом выдирать оттуда подстроку?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как выдрать из UTF-8 текста указанное количество символов"  +/
Сообщение от DHCPep (?), 06-Дек-19, 23:33 
> Может, сначала стоит перекодировать строку из UTF-8 в кодировку с фиксированной шириной
> символа,
> а потом выдирать оттуда подстроку?

А как? Если например это текст "война и мир", где есть и французский язык и русский?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Как выдрать из UTF-8 текста указанное количество символов"  +/
Сообщение от DHCPep (?), 06-Дек-19, 23:34 
> Может, сначала стоит перекодировать строку из UTF-8 в кодировку с фиксированной шириной
> символа,
> а потом выдирать оттуда подстроку?

Или есть юникод с фиксированной шириной? Тогда да, было бы конвертировать в него, там выдрать N*2 (или 3) байт, затем перегнать обратно в обычный юникод.

Но что за кодировка такая?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "Как выдрать из UTF-8 текста указанное количество символов"  +1 +/
Сообщение от anon1999 (?), 06-Дек-19, 23:47 
>> Может, сначала стоит перекодировать строку из UTF-8 в кодировку с фиксированной шириной
>> символа,
>> а потом выдирать оттуда подстроку?
> Или есть юникод с фиксированной шириной? Тогда да, было бы конвертировать в
> него, там выдрать N*2 (или 3) байт, затем перегнать обратно в
> обычный юникод.
> Но что за кодировка такая?

Есть:

- UTF-16 (правда там есть нюансы с "суррогатными парами" символов);

- UTF-32 - возможно её стоит посмотреть.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

7. "Как выдрать из UTF-8 текста указанное количество символов"  +1 +/
Сообщение от DHCPep (?), 07-Дек-19, 12:26 
> - UTF-32 - возможно её стоит посмотреть.

Да, похоже это выход!

Итого значит:
iconv -f UTF-8 -t UTF-32 original.text | head -n END_POS*4 | tail -n LEN*4 | iconv -f UTF-32 -t UTF-8

Спасибо!

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

8. "Как выдрать из UTF-8 текста указанное количество символов"  +/
Сообщение от DHCPep (?), 07-Дек-19, 12:34 
> iconv -f UTF-8 -t UTF-32 original.text | head -n END_POS*4 | tail
> -n LEN*4 | iconv -f UTF-32 -t UTF-8

-c флаг там конечно же.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Как выдрать из UTF-8 текста указанное количество символов"  +/
Сообщение от anon1999 (?), 07-Дек-19, 14:56 
>> - UTF-32 - возможно её стоит посмотреть.
> Да, похоже это выход!
> Итого значит:
> iconv -f UTF-8 -t UTF-32 original.text | head -n END_POS*4 | tail
> -n LEN*4 | iconv -f UTF-32 -t UTF-8
> Спасибо!

Пожалуйста :)

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

5. "Как выдрать из UTF-8 текста указанное количество символов"  +1 +/
Сообщение от Анонимemail (5), 07-Дек-19, 00:23 
Чес слово, ничерта не понял.
В смысле cut -c не работает с utf8 правильно???

[ diablopc@d200 ~ ]$ cat utf8.text 
абвгдежзилмнопрстуфхцчшщ

[ diablopc@d200 ~ ]$ cut -c5-8 utf8.text
дежз

Что не так то?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "Как выдрать из UTF-8 текста указанное количество символов"  +/
Сообщение от DHCPep (?), 07-Дек-19, 12:20 
> Что не так то?

Проверил, действительно с utf-8 работает cut успешно, но это зависит от настроенной локали пользователя который запускает.
Я это когда проверил под своим юзером, от которого работаю на компе и у которого всё настроено - ок. А в принципе мне надо это решение для скрипта, и работает этот скрипт в джейле, там никаких локалей у пользователя не настроено и там он выдаёт если на начало двухбайтового символа не попадает, то  кракозябру.
user$ cat ~/text.utf8
1234абвгд

user$ cut -c5-7 ~/text.utf8
абв

jail# cut -c5-7 /root/text.utf8
а�

Ну и кроме этого ещё не подходит принципиально cut как инструмент для этого, т.к. он для каждой строки берёт этот диапазон, а мне надо имея текстовый файл получить его отгрызок от такого-то символа до такого-то.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

10. "Как выдрать из UTF-8 текста указанное количество символов"  +/
Сообщение от ыы (?), 07-Дек-19, 20:44 
>[оверквотинг удален]
> user$ cat ~/text.utf8
> 1234абвгд
> user$ cut -c5-7 ~/text.utf8
> абв
> jail# cut -c5-7 /root/text.utf8
> а�
> Ну и кроме этого ещё не подходит принципиально cut как инструмент для
> этого, т.к. он для каждой строки берёт этот диапазон, а мне
> надо имея текстовый файл получить его отгрызок от такого-то символа до
> такого-то.

устанавливайте локаль прямо в скрипте.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру