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

我们正在从源系统中接收一个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

sHetB.jpg

十六进制转储示例

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|

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值