Linux下处理BOM头和^M的简单方法

Linux在网络服务器、嵌入式设备的市场上占有较大份额,Microsoft Windows在桌面操作系统上占有较大的份额,因此有很多的人喜欢用Windows去控制操作Linux。

既然用Windows去控制Linux,难免导致Windows系统上的产生的文件以某种途径传到了Linux系统中,因而导致显示问题或者出现乱码的情况。

例如用Windows自带的“记事本”(notepad)程序默认保存的文件会在每一行的结尾处带有^M标记。

PS: 一些常见的错误例子:有的人可能有疑问,为什么我用记事本把文件保存成UTF-8也不好用。还有的人在执行“sed -i ‘/^$/d‘ filename”时发现明明有空格却没有删除。

因此在日常使用过程中,无论是用什么工具编辑文件上传到Linux服务器,都需要注意换行符问题。

现象:

1.cat程序显示有问题

如文件的开头显示“?t”

2.bash、python等文件执行时报错

如-bash: ./someshname.sh: /bin/bash^M: bad interpreter: No such file or directory

但是这种情况如果不想转换换行符,可以直接用相应的解释器去执行这个文件,如

/bin/bash ./someshname.sh

3.其他应用程序如php、java等运行时报错

解释:

换行符(newline、line ending、end of line(eol)或line break),是一种控制字符,用于区分表示每一行的结束。换行符通常由line feed (LF)和carriage return (CR)两者中的一种或者它们的组合出现在计算机系统中,常见的换行符有三种:

  1. LF (UNIX and OS X \n)
  2. CR (Classic Mac \r)
  3. CRLF(Windows \r\n)

LF是Line Feed的缩写,CR是Carriage Return的缩写,他们的控制字符(\r,\n还是\r\n)由对应的ANSCII表示。

之所以出现“^M ”是因为^M在ANSCII中就表示Carriage Return即\r所以如果在Linux的某个打印输出中出现了^M,表示换行符是Windows格式的。

BOM是Byte order mark的缩写,释义为“字节顺序标记”,用于明确表明此文件属于Unicode编码,其他的一些作用可以参考维基百科的英文页面(显然中文页面解释的不全面)。

解决办法:

这个问题其实简单到没有必要用一篇文章的篇幅来表述,简答说就一句话:可以借助dos2unix 工具,将Windows格式的文本文件转化成Linux下可用的格式。但为了方便那些需要详细了解的人,特地多写几句如下。

# Remove BOM and ^M (BOM and ^M can come from Windows notepad program and save as ‘ANSI‘ or ‘UTF-8‘)    
# such as "example^M$", ANSI, ASCII text, with CRLF line terminators    
# such as "M-oM-;M-?example^M$", UTF-8, UTF-8 Unicode (with BOM) text, with CRLF line terminators    
# Linux right format is "example$", ASCII text    
# other method is using vim [noeol][dos] :set ff=unix

# determine file type

file testfilename

# display $ at end of each line, display TAB characters as ^I, use ^ and M- notation, except for LFD and TABo

cat -A testfilename

#Text file format converters. Convert text files with DOS or Mac line endings to Unix line endings and vice versa.  
# Debian & Ubuntu: apt-get install dos2unix    
# RHEL & CentOS: yum install dos2unix

# DOS/Mac to Unix and vice versa text file format converter

dos2unix testfilename

关于显示乱码问题

1.有可能跟终端(SSH连接工具)有关系,尝试调整字符编码为utf-8

2.有可能是系统原因,如缺少中文支持

一些可用的参考:

Byte order mark https://en.wikipedia.org/wiki/Byte_order_mark

Newline https://en.wikipedia.org/wiki/Newline

ANSCII https://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters

tag:bad interpreter,移除BOM,dos2unix命令,CRLF,Linux换行符

--end--

时间: 2024-08-10 17:18:19

Linux下处理BOM头和^M的简单方法的相关文章

linux下nginx实现虚拟主机(3种方法:基于域名、基于端口、基于ip地址)

在3.17日的时候已经写过一篇关于apahce的基于域名.端口.ip地址3种方式的虚拟主机实现.原理是一样的,现在记录nginx的虚拟主机这三种方式的实现. 系统版本为rhel5.6,nginx版本为1.1.6. 1.基于域名: 基于域名的方式,要先有dns服务器,这里为了方便,可以在/etc/hosts文件里面配置,把它当成dns就行了,可以参考3.17日那篇博客关于dns的配置或者其他博文也有.这里关于nginx的安装也略去. [[email protected] ~]# cat /etc/

linux下使profile和.bash_profile立即生效的方法

使profile生效的方法 1.source /etc/profile 使用.bash_profile生效的方法 1 . .bash_profile 2 source .bash_profile 3 exec bash --login linux下使profile和.bash_profile立即生效的方法,布布扣,bubuko.com

Linux下已编译PHP增加扩展so的方法,关键phpize 和config.m4

LINUX下PHP已经编译,如何新增so扩展. 用到的一个sh:/usr/local/php5/bin/phpize 原理:用phpize在压缩包里面找到对应的对应的扩展文件夹,在里面执行phpize,具体步骤: PHP安装路径:/usr/local/php5 PHP源码路径:/home/default7/lamp/php-5.5.13 扩展假设zlib:/home/default7/lamp/php-5.5.13/ext/zlib 执行代码: ln -s /usr/local/php5/bin

Kali Linux下破解WIFI密码挂载usb无线网卡的方法

Kali Linux下破解WIFI密码挂载usb无线网卡的方法 时间:2014-10-12    来源:服务器之家    投稿:root 首先我要说的是,wifi密码的破解不是想象中的那么容易,目前还没有一个可以破解任意类型wifi密码的工具或者方案存在.虽然你可以在网络上找到大量的教程,教程中有大量的成功案例,但是在实际场景中成功率是极低的. 其次,免费的午餐并不都那么好吃,希望读者在自己的内网上进行测试,毕竟学习技术是第一位的.免费午餐有可能会增加你遭受钓鱼攻击的风险. 本系列文章会针对不同

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29, 2 users, load average: 1.13, 1.04, 0.97 Tasks: 105 total, 1 running

Linux下快速清空文件内容的三种方法

Linux下快速清空文件内容的三种方法在Linux环境中,我们如果想快速清空一个文件或者log的内容: 1.#echo "" > test.txt(文件大小被截为1字节) 2.# > test.txt(文件大小被截为0字节) 3.#cat /dev/null > /home/test.txt(文件大小被截为0字节)————————————————版权声明:本文为CSDN博主「贾维斯博客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声

linux下C/C++头文件梳理,看完这篇再也不会搞糊涂头文件了!

一:前言 进行linux下C/C++服务端后台开发的都知道,需要跟各种头文件打交道. 比如使用printf函数则需要引用#include <stdio.h>,使用STL的map容器则要#include <map>,使用socket网络编程则要#include <sys/socket.h>, 那么我考考你uint32_t是在哪个头文件定义的呢?sleep函数又是在哪个头文件?open和close是在同一个头文件里吗? 是不是有点一时半会答不上来,有没有好的方法能梳理头文件

Linux下的一些头文件

项目中用到的 fcntl.h fcntl : file control : 文件控制 errno.h : 提供了一种错误报告机制 malloc.h : 动态分配内存 sys/mman.h : 内存管理声明 linux/videodev2.h : 视频驱动头文件 linnux/fb.h : frame buffer , linux的帧缓冲.驱动层直接把LCD的像素数据map到用户空间,在用户程序中可以直接在屏幕上绘图. 其他的Linux下的头文件: 以下内容来自:http://www.cnblog

Linux下编程获取本地IP地址的常见方法

转载于:http://blog.csdn.net/k346k346/article/details/48231933 在进行linux网络编程时,经常用到本机IP地址.本文罗列一下常见方法,以备不时之需. 获取本机IP地址,是一个相当灵活的操作,原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的.比如一台计算机上可以有多块物理网卡或者虚拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡设置别名,可以重命名网卡.用户计算机所在网络拓扑结构未知,主机名设置是一个可选项,并且同样可以为一