linux txt文件中出现特殊字符‘^@‘

8 篇文章 0 订阅

现象

使用curl命令从服务器中获取的是json字符串,将字符串存入文件中,文件类型成了data

# file 1.out 
1.out: data

vim打开文件后,出现如下乱码:

#^@fd^@dd^@e2^@c4^@e4^@c3#

cat -e也能看到这些字符。

c示例

经查,^@实际上对应c语言中的\0

// cat /tmp/1.c 
#include <stdio.h>
#include <string.h>
 
int main(){
   FILE *fp = NULL;
   fp = fopen("/tmp/test.txt", "w+");
   char* str = "hello";
   fwrite(str, strlen(str)+1, 1, fp);
   fclose(fp);
}

编译并执行文件

# gcc -o /tmp/1 /tmp/1.c 
# /tmp/1
# cat /tmp/test.txt 
hello
# 这里字符串本身没换行,为了方便看,在这里手动换行了
# cat -e /tmp/test.txt 
hello^@

environ文件

environ文件也是有这种情况的。

# cat -e /proc/$$/environ
TERM=xterm^@HOME=/root^@SHELL=/bin/bash^@USER=root^@LOGNAME=root^@PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin^@XDG_SESSION_ID=22272^@

具体原因

暂时不清楚当事人在编辑这个文件时,做了什么操作,导致的这个情况。

解决

使用tr命令将其中的\0字符删除。

[root@nano-kvm-11 tmp]# cat /tmp/1.out |tr -d '\0' |cat -e
mysql.driverClassName=com.mysql.jdbc.Driver$
mysql.validationQuery=SELECT 1$
mysql.testWhileIdle=true$
mysql.testOnBorrow=false$
mysql.timeBetweenEvictionRunsMillis=30000$
mysql.minEvictableIdleTimeMillis=1800000$
mysql.removeAbandoned=true$
mysql.removeAbandonedTimeout=180$
mysql.logAbandoned=true$
mysql.testOnReturn=false$
mysql.poolPreparedStatements=false$
mysql.filters=stat$
$
#fddde2c4e4c3#$
mysql.cms.db.url=$
mysql.cms.db.username=$
mysql.cms.db.password=$
mysql.cms.db.maxWait=3000$
mysql.cms.db.initialSize=10$
mysql.cms.db.minIdle=10$
mysql.cms.db.maxActive=100$
$
#ccb7fddde2c4e4c3#$
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值