Как перевести символы Unicode? [duplicate]

Сначала немного предыстории

Существуют разные версии nc , как вы можете найти на nc (1) - страница руководства Linux или nc (1) Руководство по основным командам BSD соединение должно отключиться сразу после передачи. На обоих связанных сайтах приведен пример:

Начните с использования nc для прослушивания на определенном порту, с записью вывода в файл:

 $ nc -l 1234> filename.out {{1 }} 

Используя вторую машину, подключитесь к слушающему процессу nc, передавая ему файл, который необходимо передать:

 $ nc host.example.com 1234 

После передачи файла соединение автоматически закрывается .

Ваш netcat не закрывает соединение после передачи, поэтому оно отличается от описанного выше. Он ведет себя как моя Netcat 1.10 на Debian Jessie. Это поведение описано в /usr/share/doc/netcat-traditional/README.gz (на моей машине), выделение жирным шрифтом принадлежит мне:

В простейшем случае "порт хоста nc" создает TCP-соединение с заданным портом на заданном целевом хосте. Ваш стандартный ввод затем отправляется на хост, и все, что возвращается через соединение, отправляется на ваш стандартный вывод.Это продолжается бесконечно, пока сетевая сторона соединения не отключится. Обратите внимание, что это поведение отличается от поведения большинства других приложений, которые закрывают все и завершают работу после окончания файла на стандартном вводе.

Вот причина такого поведения:

Вы можете спросить: «Почему бы просто не использовать telnet для подключения к произвольным портам?» Правильный вопрос, и вот несколько причин. Telnet имеет проблему "стандартного ввода EOF", поэтому необходимо ввести вычисляемые задержки в сценарии управления, чтобы обеспечить завершение сетевого вывода. Это основная причина, по которой netcat продолжает работать до тех пор, пока не закроется сторона сети .

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


Теперь решения

1

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

-q seconds   after EOF on stdin, wait the specified number  of  seconds
             and then quit. If seconds is negative, wait forever.

Если вы используете эту команду на отправляющей стороне:

nc -q 0 MachineIP Port < test.txt

nc завершит работу через 0 секунд после чтения EOF, то есть сразу после завершения файла. Затем он выйдет, как и принимающая сторона nc .

Если вам интересно, что происходит, если пакеты не проходят, вот комментарий Джураджа.

Когда все пакеты не встречаются, система обнаруживает это и повторно передает их без уведомления приложения (или, если это невозможно, приложение получит ошибку тайм-аута). Надежная доставка - это цель протокола TCP, предоставляемого ядром ОС, которое используется nc . Вы можете запросить протокол UDP , который этого не делает, используя nc -u , но это не случай .

2

В вышеупомянутом README.gz есть оригинальный пример, который основан на тайм-ауте -w и не требует -q вариант, который будет присутствовать в вашей реализации.

Netcat может использоваться как простой агент передачи данных, и на самом деле не имеет значения, какой конец является слушателем, а какой - клиентом - входные данные на одной стороне прибывают в другая сторона как выход. Полезно запустить прослушиватель на принимающей стороне без заданного тайм-аута, , а затем дать отправляющей стороне небольшой тайм-аут. Таким образом, слушатель будет слушать, пока вы не свяжетесь с ним, а после того, как данные перестанут передаваться, клиент отключится по тайм-ауту, выключится и заберет слушателя с собой. Если промежуточная сеть не чревата проблемами, она должна быть полностью надежной, и вы всегда можете увеличить время ожидания. Типичный пример чего-то "rsh" часто используется для: с одной стороны,

 nc -l -p 1234 | распаковать -c | tar xvfp - 
 

, а затем с другой стороны

 tar cfp - / some / dir | компресс -c | nc -w 3 othermachine 1234 
 

перенесет содержимое каталога с одного компьютера на другой , не беспокоясь о файлах .rhosts, учетных записях пользователей или inetd {{1} } конфигурации на обоих концах.

2
11.03.2018, 08:09
1 ответ

И GNU, и BSD sedподдерживают многобайтность -в соответствующих локалях, а командаyаналогичнаtr:

$ echo hello | sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
hello

Это должно работать в большинстве мест, где вы, вероятно, будете его запускать, если ваша локаль — UTF -8.


Проблема Perl не так проста, как обработка многобайтовых символов как байтов. Он прекрасно понимает ваш ввод и даже кодирует вывод, это исходный код , который он не понимает:

$ echo abc | perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'|hexdump -C
00000000  c3 af c2 bd c2 81 0a                              |.......|

Кодировка UTF -8 для «a» — это ef bd 81, поэтому вы можете видеть, что он обрабатывает «b» как второй байт, а затем искажает его, пытаясь закодировать на выходе, и то же самое для "с". Вам необходимо use utf8чтобы исходный код Perl (5 )был закодирован таким образом ; -Cуправляет вводом-выводом только во время работы программы.

Вы можете ввести use utf8;в строку -eили использовать -Mutf8в командной строке:

$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
abc

Perl 6 действительно решает эту проблему, как и многие другие, но...

11
27.01.2020, 21:49

Теги

Похожие вопросы