LinuxForum.Fans
Тема

снова о determine the newline format

Автор: moshell 20 сообщений 2342 просмотров
#355912

Доброго времени.

Имеется два файла
file -i и enca говорят что они одинаковы в плане кодировки.
но cat -A ругается на разные символы новых строк.
как определить что это за символы?

gu@moshell:~$ file -i /mnt/hgfs/shara/Yarantcev/site0085_source.xml
/mnt/hgfs/shara/Yarantcev/site0085_source.xml: application/xml; charset=us-ascii
gu@moshell:~$ enca /mnt/hgfs/shara/Yarantcev/site0085_source.xml
7bit ASCII characters
Mixed line terminators

gu@moshell:~$
gu@moshell:~$ file -i /mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml
/mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml: application/xml; charset=us-ascii
gu@moshell:~$ enca /mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml
7bit ASCII characters
Mixed line terminators

gu@moshell:~$

а вот что показывает cat

gu@moshell:~$ cat -A /mnt/hgfs/shara/Yarantcev/site0085_source.xml | grep "<Site>"
^M<Site>$
gu@moshell:~$ cat -A /mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml | grep "<Site>"
<Site>$
gu@moshell:~$
#355920
"moshell" написал:
как определить что это за символы?

Не совсем понял вопрос.
Вроде бы вывод команды

"moshell" написал:
enca /mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml
7bit ASCII characters
Mixed line terminators

Так и говорит: "разные, и те и другие" (Mixed).

Вы хотите узнать, какие именно?

В UNIX-подобных системах конец строки - это символ CR (0D). В Windows - два символа - CR LF (0D0A).
Судя по тому, что для файла site0085_source.xml Вы получили

"moshell" написал:
gu@moshell:~$ cat -A /mnt/hgfs/shara/Yarantcev/site0085_source.xml | grep "<Site>"
^M<Site>$

это "добавка" от какой-то программы, работавшей в Windows. ^M - это символ LF (0A).
То есть Ваша система Linux программой cat разделила конец строки Windows на две части, и LF (^M) перенесло в начало следующей строки:

text
^M<Site>

В одном тексте, по-видимому, образовалась каша из CR и CR LF. А другой файл содержит "нормальные" CR.

Посмотрите ещё здесь: http://ru.wikipedia.org/wiki/Управляющие_символы.

#355922

Все понял.
Все верно.
первый файл был сгенерирован из под Виндовс, и именно под него приходится писать код, из под виндовса нужно будет запихивать данные файлы.

в общем изменил концовку строк на "\n\r", теперь оба файла распознаются одинаково.

другой вопрос, мне так и не ясно, почему шайтан железяка отказывается принимать файлы с концовкой "\n"
но это совсем уже другой вопрос.

Тема решена. спасибо!

#355932

перепутали всё, что можно и нельзя.
Разделитель в nix - LF, 10(10) он же 0A(16) он же ^J он же \n.
Разделитель в dos/win пара CR LF, 13 10(10), 0C 0A(16), ^M^J, \r\n.
Одиночный CR был в маках.
Разделителя LF CR (\n\r) не описано.

#355934

испробовано уже.
при \r\n воспринимается как Windows/Dos в notepad++
при \n\r воспринимается как Unix


The concepts of line feed (LF) and carriage return (CR) are closely associated and can be either considered separately or lumped together. In the physical media of typewriters and printers, two axes of motion, "down" and "across", are needed to create another line (a new line) on the page. Although the design of a machine (typewriter or printer) must consider them separately, the abstract logic of software can lump them together as one event. This is why a newline in character encoding can be defined as LF and CR combined into one (LF+CR, LFCR, CR+LF, CRLF).
http://en.wikipedia.org/wiki/Newline



вот что получается теперь, именно при последовательности \n\r
напомню что первый файл /mnt/hgfs/shara/Yarantcev/site0085_source.xml изначально был выкачан из "шайтан железки", которую производят в китае, а софт под нее пишут индусы. Возможно поэтому такая белиберда

gu@moshell:~$ file -i /mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml
/mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml: application/xml; charset=us-ascii
gu@moshell:~$ enca /mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml
7bit ASCII characters
Mixed line terminators
gu@moshell:~$
gu@moshell:~$ file -i /mnt/hgfs/shara/Yarantcev/site0085_source.xml
/mnt/hgfs/shara/Yarantcev/site0085_source.xml: application/xml; charset=us-ascii
gu@moshell:~$ enca /mnt/hgfs/shara/Yarantcev/site0085_source.xml
7bit ASCII characters
Mixed line terminators
gu@moshell:~$ cat -A /mnt/hgfs/shara/Yarantcev/site0085_source.xml | grep "<Site>"
^M<Site>$
gu@moshell:~$ cat -A /mnt/hgfs/shara/scr/2-77-20-0086/2-77-20-0086_site.xml | grep "<Site>"
^M<Site>$
gu@moshell:~$
#355943

и кстати, при \r\n
enca определяет файл как

CRLF line terminators

####
при \n
терминация вообще не указывается,
####
а при \n\r enca кричит

Mixed line terminators

так что имеет место быть \n\r

#355949

moshell,
вы неправильно интнрпретируете результаты эксперимента, только и всего. Допустимых вариантов три
\r\n
\n
\r
И это вашими экспериментами также полностью подтверждено. Mixed line terminators означает ненормальное состояние.

#355960
bormant написал:
Mixed line terminators означает ненормальное состояние.

вот оно и нужно.

конфиг настроек в виде xml файла выгружается именно в таком виде
Mixed line terminators

#356046

То есть все приседания, чтобы узнать конец строки?
cat | head -n 2 | hexdump -C
было бы достаточно.

PS. Но за \n\r руки отрывать следует вне всяких сомнений.

#356074
text
00000000  3c 3f 78 6d 6c 20 76 65  72 73 69 6f 6e 3d 22 31  |<?xml version="1|
00000010  2e 30 22 20 65 6e 63 6f  64 69 6e 67 3d 22 49 53  |.0" encoding="IS|
00000020  4f 2d 38 38 35 39 2d 31  22 3f 3e 0a 0d 3c 21 44  |O-8859-1"?>..<!D|
00000030  4f 43 54 59 50 45 20 53  69 74 65 20 53 59 53 54  |OCTYPE Site SYST|
00000040  45 4d 20 22 53 69 74 65  45 71 75 69 70 6d 65 6e  |EM "SiteEquipmen|
00000050  74 2e 64 74 64 22 20 20  3e 0a                    |t.dtd"  >.|
0000005a

об чтом это?
hex не в зуб ногой

#356078

[console]00000020 4f 2d 38 38 35 39 2d 31 22 3f 3e 0a 0d 3c 21 44 |O-8859-1"?>..<!D|
...
00000050 74 2e 64 74 64 22 20 20 3e 0a |t.dtd" >.|
[/console]Выше хорошо видны и дефектная пара 0a 0d, и что head считает разрывом строки один 0a.

#356083

Прошу прощения, можно как "для начинающих" объяснить?

#356086

Крайняя левая колонка -- смещения от начала. Далее содержимое распечатано побайтно по 16 байт на строку (по 10(16)), каждый байт содержимого выведен в шестнадцатеричном представлении. Для удобства отсчёта первые и последние 8 байт в одной строке разделены дополнительными пробелами. Самая правая колонка между символами "|" содержит символы ASCII из печатного диапазона.

#356088

спасибо, но ничего не понял, вообще то интересовал вердикт, диагноз так сказать, а не симптомы.

этот дамп я снял с рабочего конфига.
что в нем не так?
и какие все таки у него разделители?

#356111

"moshell" написал:
какие все таки у него разделители?
У него 0a 0d они же \n\r.
#356115

То есть, получается, конфиг настроек, слитый штатными средствами из железки изначально кривой???

дело в том, что железка только такие кривые и забирает.
\r\n и \n не хочет.

индусы, млин

#356119
"moshell" написал:
дело в том, что железка только такие кривые и забирает.

>>> железо кривое

"moshell" написал:
индусы

Словом, +1!

#356127

но. тем не менее. тема то решена :)

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

это дешевле. 1 наш брат == 10 индусов

#356129

Хм, а может, они это специально, чтоб жизнь медом не казалась.

#356136

вообще как то странно, подключаясь локально с приложения под виндовс ОС.
только \n\r работает.


если я захожу на сервер, который крутится на solaris, и уже с сервера захожу на "объект", то я могу ЗАлить ему что угодно
\n и \r\n
и ДАЖЕ \n\r

НО! при этом, если я Сливаю с него, он опять же мне выдает
Mixed line terminators и \n\r



я то уже хотел привязать беду к ОС. ан нет..

Войдите или зарегистрируйтесь, чтобы ответить.