Здравствуйте!У меня такая задача возникла. Есть файл текстовый, в UTF-8.
И я хочу из него вывести произвольный кусок текста. Т.е. если в файле N символов (не байт!), я хочу получить функцию substr(txt, K, M), где K<M<=NВсё это хочу сделать в консоли. Пробовал cut, он естественно не работает, т.к. cut -cK-M конечно считаем байтами. А у меня utf-8.
Есть ли возможность получить результат как cut но для символов, а не байт?
Желательно не внешними утилитами а из стандартного набора.Спасибо!
>[оверквотинг удален]
> У меня такая задача возникла. Есть файл текстовый, в UTF-8.
> И я хочу из него вывести произвольный кусок текста. Т.е. если в
> файле N символов (не байт!), я хочу получить функцию substr(txt, K,
> M), где K<M<=N
> Всё это хочу сделать в консоли. Пробовал cut, он естественно не работает,
> т.к. cut -cK-M конечно считаем байтами. А у меня utf-8.
> Есть ли возможность получить результат как cut но для символов, а не
> байт?
> Желательно не внешними утилитами а из стандартного набора.
> Спасибо!Может, сначала стоит перекодировать строку из UTF-8 в кодировку с фиксированной шириной символа,
а потом выдирать оттуда подстроку?
> Может, сначала стоит перекодировать строку из UTF-8 в кодировку с фиксированной шириной
> символа,
> а потом выдирать оттуда подстроку?А как? Если например это текст "война и мир", где есть и французский язык и русский?
> Может, сначала стоит перекодировать строку из UTF-8 в кодировку с фиксированной шириной
> символа,
> а потом выдирать оттуда подстроку?Или есть юникод с фиксированной шириной? Тогда да, было бы конвертировать в него, там выдрать N*2 (или 3) байт, затем перегнать обратно в обычный юникод.
Но что за кодировка такая?
>> Может, сначала стоит перекодировать строку из UTF-8 в кодировку с фиксированной шириной
>> символа,
>> а потом выдирать оттуда подстроку?
> Или есть юникод с фиксированной шириной? Тогда да, было бы конвертировать в
> него, там выдрать N*2 (или 3) байт, затем перегнать обратно в
> обычный юникод.
> Но что за кодировка такая?Есть:
- UTF-16 (правда там есть нюансы с "суррогатными парами" символов);
- UTF-32 - возможно её стоит посмотреть.
> - 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Спасибо!
> 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 флаг там конечно же.
>> - 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
> Спасибо!Пожалуйста :)
Чес слово, ничерта не понял.
В смысле cut -c не работает с utf8 правильно???
[ diablopc@d200 ~ ]$ cat utf8.text
абвгдежзилмнопрстуфхцчшщ[ diablopc@d200 ~ ]$ cut -c5-8 utf8.text
дежзЧто не так то?
> Что не так то?Проверил, действительно с utf-8 работает cut успешно, но это зависит от настроенной локали пользователя который запускает.
Я это когда проверил под своим юзером, от которого работаю на компе и у которого всё настроено - ок. А в принципе мне надо это решение для скрипта, и работает этот скрипт в джейле, там никаких локалей у пользователя не настроено и там он выдаёт если на начало двухбайтового символа не попадает, то кракозябру.
user$ cat ~/text.utf8
1234абвгдuser$ cut -c5-7 ~/text.utf8
абвjail# cut -c5-7 /root/text.utf8
а�Ну и кроме этого ещё не подходит принципиально cut как инструмент для этого, т.к. он для каждой строки берёт этот диапазон, а мне надо имея текстовый файл получить его отгрызок от такого-то символа до такого-то.
>[оверквотинг удален]
> user$ cat ~/text.utf8
> 1234абвгд
> user$ cut -c5-7 ~/text.utf8
> абв
> jail# cut -c5-7 /root/text.utf8
> а�
> Ну и кроме этого ещё не подходит принципиально cut как инструмент для
> этого, т.к. он для каждой строки берёт этот диапазон, а мне
> надо имея текстовый файл получить его отгрызок от такого-то символа до
> такого-то.устанавливайте локаль прямо в скрипте.