现象
使用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#$