Проблема с многобайтовыми символами при распаковке в linux - PullRequest
0 голосов
/ 23 октября 2018

мы получаем zip-файл из исходной системы.Это файл .zip.мы распаковываем его в Linux с помощью команды unzip.файл .zip содержит файл .dat, который содержит строки одинаковой ширины.Чтобы быть точным, это файл с фиксированной шириной.Но при распаковке в файл .dat добавляются дополнительные символы, что приводит к разнице в длине разных строк.

 unzip edw_ord_extr_3x_SIQP_20181021.182305.zip

, что приводит к edw_ord_extr_3x_SIQP_20181021.182305.dat

grep -P -n -a "[\x00-\x1F]"  edw_ord_extr_3x_SIQP_20181021.182305.dat | wc -l
467

Этопоказывает, что есть специальные символы в 467 строках в соответствии с дизайном.Я открыл файл bad.dat в vi и нашел специальные символы.Пример:

@^@^R^@
^A^@
<90>^@^@^@


 grep -P -n -a "[\x00-\x1F]"  edw_ord_extr_3x_SIQP_20181021.182305.dat  > bad.dat
    awk '{ print length($0) }' bad.dat | sort | uniq
    2090
    2091
    2092
    2219
    2220
    2221
    2222
    2223
    2224
    2225

2219 - правильная длина.Это подразумевает, что наличие специальных символов может увеличить количество символов или уменьшить количество символов или не изменить количество символов.

мы обошли обходные пути, заменив все специальные символы на?

perl -pe 's/[\000-\011]|[\013-\037]|[\177-\377]/?/g' edw_ord_extr_3x_SIQP_20181021.182305.dat > clean.dat

на данный момент проблема решена.

Но мне нужно понять, почему специальные символы вставляются при выполнении команды unzip ?.Почему спецсимволы изменяют длину строки?Насколько я понимаю, специальный символ считается 1 символом, но в данном случае это не так.

Сведения о файле.

 file -bi edw_ord_extr_3x_SIQP_20181021.182305.dat
    application/octet-stream; charset=binary

Я открыл файл bad.dat в notepad ++ и могучтобы увидеть специальные символы, такие как SOH, BEL, NUL

enter image description here

Sample Hex Dump

000dff20  20 54 31 20 20 30 31 20  20 20 20 20 20 20 20 20  | T1  01         |
000e07d0  20 20 54 31 20 20 30 31  20 20 20 20 20 20 20 20  |  T1  01        |
000e0e10  30 2e 30 30 30 30 30 30  58 5a 01 3f 00 00 00 00  |0.000000XZ.?....|
000e3340  20 30 39 30 30 20 20 54  31 20 20 30 31 20 20 20  | 0900  T1  01   |
000e4d60  31 20 20 30 31 20 20 20  20 20 20 20 20 20 20 20  |1  01           |
000e78d0  30 30 20 20 54 31 20 20  30 31 20 20 20 20 20 20  |00  T1  01      |
000e7f20  00 00 01 00 52 4f 3f 20  20 20 20 46 41 4c 4c 42  |....RO?    FALLB|
000e8180  37 30 30 20 20 54 31 20  20 30 31 20 20 20 20 20  |700  T1  01     |
000e87d0  00 00 00 01 00 52 4f 3f  20 20 20 20 46 41 4c 4c  |.....RO?    FALL|
...