1

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

Имеется два файла
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:~$

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

2

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) перенесло в начало следующей строки:

^M<Site>

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

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

3 (19.12.2013 12:24:36 отредактировано moshell)

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

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

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

4

перепутали всё, что можно и нельзя.
Разделитель в 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) не описано.

5 (19.12.2013 14:02:51 отредактировано moshell)

испробовано уже.
при \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:~$

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

6 (19.12.2013 14:27:19 отредактировано moshell)

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

CRLF line terminators

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

Mixed line terminators


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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

7 (19.12.2013 15:47:34 отредактировано bormant)

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

8

bormant пишет:

Mixed line terminators означает ненормальное состояние.

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

9 (19.12.2013 19:53:50 отредактировано bormant)

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

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

10

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 не в зуб ногой

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

11 (19.12.2013 21:16:52 отредактировано bormant)

 Консоль:
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"  >.|
Выше хорошо видны и дефектная пара 0a 0d, и что head считает разрывом строки один 0a.

12

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

13

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

14

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

15

moshell пишет:

какие все таки у него разделители?

У него 0a 0d они же \n\r.

16

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

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

индусы, млин

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

17

moshell пишет:

дело в том, что железка только такие кривые и забирает.

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

moshell пишет:

индусы

Словом, +1!

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

18

но. тем не менее. тема то решена ab

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

19

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

20

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


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

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



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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс