1. 程式人生 > 其它 >linux 處理 BOM頭 ^M 方法

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.有可能是系統原因,如缺少中文支援