您的位置:首页 > 运维架构 > Linux

masterJ2SE篇002——Windows与Linux回车换行的转换

2016-10-27 16:01 260 查看
通常说的回车换行在不同系统中是不一样的,回车对应的Unicode是\u000d,换行对应的Unicode是\u000a

Linux 每行是以
换行 来结尾的,即\n
Windows 每行是以
回车换行 来结尾的,即\r\n
Mac 每行是以 回车 来结尾的,即\r
这样就导致了一些问题,标准的Linux和Mac系统的文件,在Windows里是只有一行的,而Windows系统的文件,在Linux里,每行最后会多出一个^M,这里的^M是需要Ctrl+V,Ctrl+M打出来的

我们既然知道了回车换行的本源,可以写一个小程序来将Windows文件转化为Linux文件,也可以将Linux文件转化为Windows文件。

首先,拿到文件,按行读取,那么Java按行读取的标准是什么?\n还是\r\n,其实看了源代码就可以发现,Java按行读取是遇到换行符就会把之前读取到的返回,我们是不知道他到底读取到了\n还是\r\n,因为它把\n和\r\n都当做一个换行符了。

那现在就好办了

去掉^M:就是把读取到的内容,一个一个字符的处理,转化为Unicode,如果是\u000d或者\u000a就删掉,否则留下这个字符,最后在末尾加上\n,这样做可以把全部的^M都去掉

加上^M:就是把读取到的内容,一个一个字符的处理,转化为Unicode,如果是\u000d或者\u000a就删掉,否则留下这个字符,最后在末尾加上\r\n

下面给出将字符串转换为Unicode的代码。

public static String removeJianMByUnicode1(String str){

if(str==null||str.equals("")){

return str;

}

String tmp1;

String tmp2;

StringBuffer sb = new StringBuffer();

char c;

int i, j,k;

for (i = 0; i < str.length(); i++) {

c = str.charAt(i);

j = (c >>> 8); // 取出高8位

tmp1 = Integer.toHexString(j);

k = (c & 0xFF); // 取出低8位

tmp2 = Integer.toHexString(k);


if ((tmp1+tmp2).equals("0a")){

continue;

}

if ((tmp1+tmp2).equals("0d")){

continue;

}

sb.append(c);

}

//以下两种方式都OK

//方式一

char c0 = 10;

sb.append(c0);

//方式二

sb.append("\n");


return sb.toString();

}

[/code]

另外,我们在Linux环境中可以直接通过Shell去掉^M

sed 's/^M//g' a.txt > b.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  换行符