2010-08-08 2 views
2

В недавнем question было отмечено, что в OSX, выполняющем sed в файле non ascii, даются странные результаты. Например, если вы делаете (/ USR/бен/кал случайный двоичный файл)LANG и sed на OSX

sed 's/[^A-Z]//' /usr/bin/cal 

sed удалит все, кроме A-Z печатаемых символов, но многие непечатаемые символы остаются. Если, однако, вы делаете

LANG='' sed 's/[^A-Z]//' /usr/bin/cal 

выводятся только A-Z (и символы новой строки). Зачем?

Обычно LANG=en-US.UTF-8 Что происходит? Я все равно не вижу, что вывод sed можно считать правильным в UTF-8. Разбито ли это, или есть какое-то представление о работе, которое я не понимаю?

Я знаю, что OSX sed соответствует POSIX и поэтому отличается от любимого GNU sed.

ответ

3

Двоичные данные, такие как содержимое/usr/bin/cal, не являются UTF-8, и поэтому путают любой код, который читает его, как если бы он был. В частности, любой байт с набором высоких бит (например,> = 128) будет интерпретироваться как часть многобайтовой последовательности, представляющей один символ, и, таким образом, будет исключен из вывода. Не все последовательности байтов с высоким набором бит действительны UTF-8, поэтому все будет запутано, но это, вероятно, объясняет, почему некоторые непечатаемые символы остаются, но (возможно) не другими.

Вкратце: если вы хотите использовать текстовые инструменты для двоичных данных, не делайте этого.

Смежные вопросы