在Linux中解压缩时遇到多字节字符的问题

时间:2018-10-23 11:46:22

标签: linux unix encoding character-encoding special-characters

我们正在从源系统中接收一个zip文件。这是一个.zip文件。 我们正在使用unzip命令在Linux中将其解压缩。 .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行中有特殊字符。 我已经在vi中打开bad.dat文件,发现特殊字符。 例如:

@^@^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

到目前为止,问题已解决。

但是我需要了解为什么在执行解压缩命令时插入特殊字符? 为什么特殊字符会改变行长?我的理解是特殊字符被认为是1个字符,但在这种情况下不是。

文件详细信息。

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

我已在notepad ++中打开bad.dat文件,并能够看到特殊字符,例如SOH,BEL,NUL

enter image description here

十六进制转储示例

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|

0 个答案:

没有答案