LINUX.ORG.RU

Напечатать UTF-8 символ в аргумент командной строки


0

1

Для одной программы мне надо в качестве аргумента передать UTF-8 символ. Что-то вроде такого:

./program \x0301
Но хочется, чтобы программа (на Си) не занималась конвертацией обозначения в символ, а генерировать его код где-то вне программы.
Можно ли сделать что-то с помощью echo? Что-то типа такого:
$ echo -e "\x21"
!
Или придется тянуть Python?
$ python -c 'print u"\u0301"'
$ python -c 'print unichr(0x0301)'

★★★★★

Ответ на: комментарий от x3al

В баше (был zsh) то же самое:
\uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
\UHHHHHHHH
the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

x3al ★★★★★
()
Ответ на: комментарий от x3al

Не печатает:

$ echo -e "\u0301"
\u0301
Кстати, у меня в мане об этом нету.
\xHH   byte with hexadecimal value HH (1 to 2 digits)

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify
@madoka~>echo -e "\u0301"          18:24:09

@madoka~>echo -e '\u0301'          18:24:15

УМВР.

у меня в мане

man bash, /^SHELL BUILTINS man zshbuiltins. man echo — ман по /bin/echo, он тебе нужен?

x3al ★★★★★
()

echo d182cc81d0b5d181d182d18b0a | xxd -p -r
т́есты

anonymous
()
Ответ на: комментарий от x3al

Debian 6.0

man bash
....
       echo [-neE] [arg ...]
              Output the args, separated by spaces, followed by a newline.  The return status is always 0.  If -n is specified,  the  trailing  newline  is
              suppressed.   If the -e option is given, interpretation of the following backslash-escaped characters is enabled.  The -E option disables the
              interpretation of these escape characters, even on systems where they are interpreted by default.  The xpg_echo shell option may be  used  to
              dynamically determine whether or not echo expands these escape characters by default.  echo does not interpret -- to mean the end of options.
              echo interprets the following escape sequences:
              \a     alert (bell)
              \b     backspace
              \c     suppress further output
              \e     an escape character
              \f     form feed
              \n     new line
              \r     carriage return
              \t     horizontal tab
              \v     vertical tab
              \\     backslash
              \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
              \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
У тебя не так?

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify
              \a     alert (bell)
              \b     backspace
              \c     suppress further output
              \e
              \E     an escape character
              \f     form feed
              \n     new line
              \r     carriage return
              \t     horizontal tab
              \v     vertical tab
              \\     backslash
              \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
              \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
              \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
              \UHHHHHHHH
                     the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)
eix -e bash|grep Install         18:35:31
     Installed versions:  4.2_p10(02:41:13 PM 05/25/2011)(-afs -bashlogger -examples -mem-scramble -net -nls -plugins -vanilla)
x3al ★★★★★
()
Ответ на: комментарий от pacify

г мамонта такое г

echo [-neE] [arg ...]
…
              \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
              \UHHHHHHHH
                     the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)
anonymous
()
Ответ на: г мамонта такое г от anonymous

Печально. Меня этот регресс xUSSR (когда мы плетёмся в Unicode-хвосте) удручает.

Ладно, попробую через Python.

pacify ★★★★★
() автор топика
Ответ на: комментарий от ananas

ну так а что мешает использовать ./program `echo -e '\x0301'` ?


Банально, 4-значные коды не поддерживаются этой версией bash/echo:

$ echo -e '\x0301'
01

pacify ★★★★★
() автор топика
Ответ на: комментарий от ananas
$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
pacify ★★★★★
() автор топика
Ответ на: комментарий от bvvv

В смысле printf «\x03\x01»? Нужно будет переводить всё в UTF-8 руками:

@madoka~>echo -e '\u0301'|xxd      21:25:21
0000000: cc81 0a                                  ...
@madoka~>printf '\x03\x01\n'|xxd   21:25:24
0000000: 0301 0a    

x3al ★★★★★
()

> Но хочется, чтобы программа (на Си) не занималась конвертацией обозначения в символ, а генерировать его код где-то вне программы.

молодец, чо. вместо вызова wctomb/wcstombs/sprintf намного проще вызвать левую утилиту через fork+exec с туевой хучей флагов, которая благополучно глюкнет на экзотической локали… тебе в детстве случайно гланды через анус не удаляли?

arsi ★★★★★
()
Ответ на: комментарий от arsi

> тебе в детстве случайно гланды через анус не удаляли?

Через анус - нет. Зато привили чувство грамотности и нормы этики.

pacify ★★★★★
() автор топика
Ответ на: комментарий от arsi

> вместо вызова wctomb/wcstombs/sprintf

Я подумаю. Но мне эти программные пляски с бубном вместо обычной передачи через командную строку - не нравятся.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

> пляски с бубном вместо обычной передачи через командную строку

ты очень точно описал свои извращённые желания из стартового поста.

arsi ★★★★★
()
Ответ на: комментарий от arsi

> ты очень точно описал свои извращённые желания из стартового поста.

Могу только сказать, что у меня отвращение к UTF-8, начиная с её появления «на публике». Можно было придумать не такую универсальную, но - более удобную для различных конвертаций систему. Например, какое-то подобие UTF-16 меня бы устроило. Китайские символы можно бы было вынести в отдельный стандарт.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

>Например, какое-то подобие UTF-16 меня бы устроило.
Может, ты хотел сказать «UTF-32»? UTF-16 не fixed-length.

Китайские символы можно бы было вынести в отдельный стандарт.

Закопать. Этому нет оправданий.

x3al ★★★★★
()
Ответ на: комментарий от x3al

> Может, ты хотел сказать «UTF-32»?

Да, я имел ввиду какой-то из них, где fixed ширина символа.
Это - очень удобно.

А нынешнюю кашу из UTF-8 символов программисты до сих пор разгребают, затратив на это кучу времени.
Да и не все символы есть в том же терминале. less/more уже не посмотреть.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

> Могу только сказать, что у меня отвращение к UTF-8

к психологу обращался?

> Можно было придумать не такую универсальную, но - более удобную для различных конвертаций систему.

и чем ISO мотивировала отказ от предложенной тобой системы?

> Например, какое-то подобие UTF-16 меня бы устроило.

да кому ты нужен…

> Китайские символы можно бы было вынести в отдельный стандарт.

тебя бы вынести в отдельную вселенную…

arsi ★★★★★
()
Ответ на: комментарий от pacify

>удобную для различных конвертаций систему
а что неудобно-то? Есть символы, есть их коды, всё в порядке. Нормализация есть также.

Китайские символы можно бы было вынести в отдельный стандарт.

«За это убивать надо», — говорил Лёлик в одном известном фильме.

anonymous
()
Ответ на: комментарий от pacify

>Да, я имел ввиду какой-то из них, где fixed ширина символа.
mbrtowcs в линуксах делает UTF-32 из текущей локали. В win32 он делает UTF-16, что не так весело, но сносно

Да и не все символы есть в том же терминале. less/more уже не посмотреть.

В смысле?

x3al ★★★★★
()
Ответ на: комментарий от anonymous

>> Могу только сказать, что у меня отвращение к UTF-8

к психологу обращался?


А что, с психологами какие-то сложности нынче? :)


а что неудобно-то? Есть символы, есть их коды, всё в порядке. Нормализация есть также.


Индексировать сложно.


x3al:

Да, я имел ввиду какой-то из них, где fixed ширина символа.

mbrtowcs в линуксах делает UTF-32 из текущей локали.


Во, спасибо. Может быть, получится эту функцию где-то использовать.

Да и не все символы есть в том же терминале. less/more уже не посмотреть.

В смысле?


Я пробую less example.txt для текста на церковно-славянском (эти коды есть практически все в стандарте), установлен шрифт терминус - многие символы не отображаются посредством less/more.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

>установлен шрифт терминус - многие символы не отображаются посредством less/more.
less/more не виноваты, как и кодировка. Эмулятор терминала не может найти нужный (да ещё и моноширинный) шрифт.

x3al ★★★★★
()
Ответ на: комментарий от pacify

А в чем проблема юникода, что в твоем терминусе нету церковно-славянского?

Китайские символы можно бы было вынести в отдельный стандарт.


Тебя бы выселить за пределы планеты.

tensai_cirno ★★★★★
()
Ответ на: комментарий от tensai_cirno

> А в чем проблема юникода, что в твоем терминусе нету церковно-славянского?

Я оцениваю систему в целом - кодировка + шрифты.
После внедрения Unicode, с текстом стало неудобно работать.
Вот отдельные кодовые таблицы (для каждого языка) - мне нравятся больше.
Даже, если бы они были из строго 2-х байтовых символов.

Тебя бы выселить за пределы планеты.


Шаблонное мышление detected. Может лучше китайцев к нам пригласить в РФ, для повышения ВВП, и качества Линукса в частности? )

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

>После внедрения Unicode, с текстом стало неудобно работать.
До внедрения Unicode с мультибайтным текстом вообще невозможно было работать. Это лучше?
Unicode, конечно, ужасен (я бы предпочёл troncode), но лучше, чем каша из национальных кодировок.

Даже, если бы они были из строго 2-х байтовых символов.

Переписывать *все* утилиты, считающие, что кодировка всегда совместима с ASCII? Это сколько человеколет?

Может лучше китайцев к нам пригласить в РФ, для повышения ВВП, и качества Линукса в частности?

Внезапно, одни японцы внесли в линукс больше, чем русские. При том, что они пользуются китайскими иероглифами.

x3al ★★★★★
()
Ответ на: комментарий от pacify

>Я оцениваю систему в целом - кодировка + шрифты.
Поздравляю. Только до юникода не было церковнославянских символов вообще. Ни в одной кодировке.

x3al ★★★★★
()
Ответ на: комментарий от x3al

> Это сколько человеколет?

Не знаю. Мы в этой гонке - в самом хвосте. В голове колонны - американцы.
Как пример отдельной кодировки - см., например, HIP - стандарт де-факто для церковно-славянского. Он кодируется обычными ASCII 7-bit.

Только до юникода не было церковнославянских символов вообще. Ни в одной кодировке.


Я могу ошибаться конечно, но еще тогда был стандарт HIP:
http://www.pechatnyj-dvor.narod.ru/docs.html

P.S. Если сравнивать UTF-8 и RTF, то мне по душе RTF, так как его можно редактировать в обычном текстовом редакторе. Вот если бы еще для каждого языка разработали что-то подобное HIP - было бы вообще замечательно. Там можно указывать ударения и мягкие переносы. Кодировка + базовые вещи для разметки текста.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Вариант 20 языков, хорошенько перемешанных в 1 тексте, не рассмативаем? А зря. В этом случае отдельные кодировки просто сосут. UTF8 наше всё и ты его просто не умеешь готовить вот и всё.

anonymous
()
Ответ на: комментарий от pacify

ITT: не осилил → не нужно.

>Как пример отдельной кодировки - см., например, HIP - стандарт де-факто для церковно-славянского.
И чем он лучше?

Он кодируется обычными ASCII 7-bit.

Нет, он кодируется ASCII 7-bit + информацией о локали.

Если сравнивать UTF-8 и RTF, то мне по душе RTF, так как его можно редактировать в обычном текстовом редакторе.

UTF-8 можно редактировать в обычном текстовом редакторе.

мне по душе RTF


Там можно указывать ударения и мягкие переносы.

В юникоде есть ударения и мягкие переносы.

x3al ★★★★★
()
Ответ на: ITT: не осилил → не нужно. от x3al

> Нет, он кодируется ASCII 7-bit + информацией о локали.

Само понятие - локали - порочно, ИМХО.
Для кодирования знаков из церковно-славянского,
приходится захватывать символы из разных кодовых страниц Unicode.

В юникоде есть ударения и мягкие переносы.


Но они (например, мягкие переносы) практически не используются для
набора текстов (см. например - библиотеку Мошкова).

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

>Само понятие - локали - порочно, ИМХО.
Конечно. Отсюда и взялось явление UTF8-монокультуристов, не желающих признавать остальные кодировки в обмене текстом.

Но они (например, мягкие переносы) практически не используются

Это не проблема юникода. Библиотека Мошкова заполнена текстами, созданными в доюникодный период.

x3al ★★★★★
()
Ответ на: комментарий от pacify

>кодовых страниц Unicode

Это что-то типа деревянного железа?

anonymous
()
Ответ на: комментарий от x3al

А UTF-32 fixed-length по-вашему? Просто пока символов нет за пределами интервала, представляемого четыремя байтами :)

buddhist ★★★★★
()
Ответ на: комментарий от x3al

Только до юникода не было церковнославянских символов вообще.

Они были на бумаге :) И не были никому нужны при наборе текстов в электронном виде.

buddhist ★★★★★
()
Ответ на: комментарий от tensai_cirno

>> HIP

Это вообще разметка текста.


Это - кодировка ASCII 7-bit символами. Строки легко читаются «с листа».
Плюс - разметка. Инфа 100%, почти от разработчиков.


У топик-стартера же наблюдается прогрессирующий ПГМ.


Может не будем о печальном?

pacify ★★★★★
() автор топика
Ответ на: комментарий от buddhist

>> Только до юникода не было церковнославянских символов вообще.

Они были на бумаге :) И не были никому нужны при наборе текстов в электронном виде.


Именно, что станадрт HIP был еще в 2001 году (шестая редакция стандарта), для набора церковно-славянского в виде:
«и= ны'нjь просвjьти` мои` _о='чи мы'сл_енныя, w\тве'рзи моя^
о_у=ста`, поуча'тися словес_е'мъ твои^мъ, ...»

Это было еще до 2001 года, когда под Linux массово использовалась KOI8-R.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

> Это - кодировка ASCII 7-bit символами

Ой, ошибся. Тут 8 бит. Но от выбора кодировки отдельных символов результат вообще не зависит.
Можно использовать и Windows-1251, и KOI8-R, и - CP866.
Лишь бы был русский. На базе него и «достраиваются» все буквы церковно-славянского алфавита.

pacify ★★★★★
() автор топика
Ответ на: комментарий от buddhist

>А UTF-32 fixed-length по-вашему?
Да, его с запасом хватает для диапазона в 21 бит (UCS-4). Нет, при контакте с внеземными цивилизациями может понадобиться 128битный UCS-6, но сейчас и этого хватает.

x3al ★★★★★
()
Ответ на: комментарий от pacify

День каменного века на лоре что ли? Такие нехорошие слова как «кодировка», «кодовые страницы» вообще надо забыть, тем более что на линуксах для забывания этого давно созданы все условия. Это винда до сих пор с динозаврами пребывает.

anonymous
()
Ответ на: комментарий от pacify

>Именно, что станадрт HIP был еще в 2001 году
Unicode был ещё в 1991 году, и что дальше?

когда под Linux массово использовалась KOI8-R.

Линукс всегда паршиво поддерживал локали. Но это не повод их плодить.

x3al ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.