Семейная реликвия TR Toolchest: ошибка (ошибки), пытающаяся удалить дополнение набора, содержащего многобайтовый символ?

Ваш вопрос немного слишком универсален здесь.

Пример:

sed 's/..\(.*\(..\)\)/\2\1/'

Заменил бы первые два символа каждой строки с двумя последними (только если существует по крайней мере 4 символа на тех строках).

$ echo abcdef | sed 's/..\(.*\(..\)\)/\2\1/'
efcdef

Прием должен использовать \(...\) получать, что подбирается и использует его в сменной детали как \1, \2...

6
13.04.2017, 15:37
1 ответ
[1188159] Я видел это раньше. Жучок. Попробуйте:

(это было из беглого взгляда несколько месяцев назад, пока этот патч не заставит вас двигаться, я не могу гарантировать, что он правильный. Применяйте заплатку [1188626]-l[1188627]).

Также обратите внимание, что [1188628]/dev/urandom[1188629] обеспечивает поток [1188630]байт[1188631]. В UTF-8 не все последовательности байтов сопоставляются с действительными символами. Например, 0x41 0x81 0x41 не является действительным, так как [1188632]0x81[1188633] составляет [1188634]>=[1188635] 0x80, поэтому он может возникать только в последовательности размером 2 или более байтов более 0x80.

Недействительный байт, так как он не входит в набор символов, который является дополнением к ☠, не будет удален с помощью [1188636]tr[1188637].

Лучше было бы:

ucs-2, будучи символами от U+0000 до U+FFFF, закодированными по 2 байта на символ, [1188638]/dev/urandom[1188639] больше похоже на поток символов ucs-2. (хотя нам не хватает символов от U+10000 до U+10FFFF)

Но это все равно включало бы диапазон суррогатных пар [1188640]D800...DFFF[1188641]. которая [1188642]mbrtowc(3)[1188643] задохнется (по крайней мере, в моей версии libc).

Эта точка кода зарезервирована для кодировки UTF-16. d800dc00, например, это кодировка UTF-16BE для U+10000, но нет ни символа U+D800, ни символа U+DC00. Кодировка UTF-8 тоже не имеет смысла как символ (даже если она смежная).

  Length      Date    Time    Name
---------  ---------- -----   ----
       23  2011-07-12 14:10   asd.txt
---------                     -------
       23                     1 file

Поэтому сначала нужно их исключить:

Если нужно получить поток случайных символов Юникода в кодировке UTF-8, то лучше всего получить случайную точку кода в допустимом диапазоне (0...0xd7ff, 0xf000...0x10ff) и преобразовать ее в UTF-8. Если вы хотите основываться на [1188644]/dev/urandom[1188645], то для каждой точки кода можно использовать 3 байта (24 бита):

7
27.01.2020, 20:27

Теги

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