運維日記003 那些曾經令人頭痛的亂碼

2021-07-15 04:20:05 字數 1989 閱讀 5585

在計算機還沒有出現之前,有一種叫做電傳打字機(teletype model 33)的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。

於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。乙個叫做「回車」(,在c語言中用「\r」表示,對應的ascii碼為0x0d),告訴打字機把列印頭定位在左邊界;另乙個叫做「換行」(,在c語言中用」\n」表示,對應的ascii碼為0x0a),告訴打字機把紙向下移一行。這就是「換行」和「回車」的來歷,從它們的英語名字上也可以看出一二。

後來,計算機發明了,這兩個概念也就被般到了計算機上。那時,儲存器很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加乙個就可以。於是,就出現了分歧。unix一族決定只用進紙乙個字元來表示行尾。來自蘋果陣營的人則把回車作為換行的標準。ms-dos(和微軟的windows)仍然決定沿用古老的回車換行傳統。所以,unix/linux下的一些傳統軟體以0x0a作為換行標誌,而windows下的軟體以0x0a0d作為換行標誌。這樣造成的直接後果是,unix/mac系統下的檔案在windows裡開啟的話,所有文字會變成一行;而windows裡的檔案在unix/mac下開啟的話,在每行的結尾可能會多出乙個^m符號。

舉個例子,寫一小段c++**:

$ vim a.cpp
**內容:

#include 

using

namespace

std;

int main()

執行該程式,用vi開啟輸出的內容:

$ g++ a.cpp

$ ./a.out > a.txt

$ vi a.txt

可以看到兩個」^m「的符號。而在windows系統下用記事本開啟則完全正常。用hexdump檢視a.txt檔案,可以看到兩處0d0a標誌。

$ hexdump a.txt
0000000 6168 6168 6168 0a0d 6978 6978 0a0d     

000000e

處理這類亂碼和序列問題可以使用unix2dos和dos2unix兩個小工具。在rhel6/centos6下我們用如下命令安裝:

# yum install unix2dos

# yum install dos2unix

這兩個工具使用的方法也很簡單:

$ dos2unix -n a.txt b.txt
上面這條命令把dos/windows下的文字檔案a.txt轉換為unix/linux下的文字檔案b.txt。可以用hexdump開啟b.txt觀察一下,可以發現0a0d的標誌都換成了0a標誌。unix2dos的用法與之類似。

iconv工具可以方便的在不同的字元編碼之間進行轉換。其命令用法為:

iconv [選項…] [檔案…]

有如下選項可用:

輸入/輸出格式規範:

-f, –from-code=名稱 原始文字編碼

-t, –to-code=名稱 輸出編碼

資訊:

-l, –list 列舉所有已知的字符集

輸出控制:

-c 從輸出中忽略無效的字元

-o, –output=file 輸出檔案

例如,要將檔案readme.txt由gb2312編碼轉換為utf-8編碼,使用如下命令:

$ iconv -f gb2312 -t utf8 ./readme.txt -o

./readme_utf8.txt

另外,系統還提供了乙個iconv函式可供程式設計時呼叫,用於解決編碼轉換問題。具體使用方法可檢視手冊:

$ man 3 iconv
注:以上內容有較多篇幅摘抄自網際網路,在此向作者表示感謝!

運維日記005 系統簡單優化

網際網路上的計算機,都會有乙個唯一的32位的位址,ip位址,我們訪問伺服器,就必須通過這個ip位址 區域網裡也有預留的ip位址 192 10 172 開頭。區域網的ip位址也是唯一的 乙個ip位址代表一台主機,但是主機上可能會有很多服務,一台主機上的不同的服務功能,就是通過埠區分,然後讓外部人員訪問...

運維學習日記 Linux學習01

運維須知的網路基礎知識 一 計算機網路 從硬體上定義,計算機網路是通過線纜將網路裝置和計算機連線起來 從軟體上定義,計算機網路是作業系統 應用軟體 應用程式通過通訊線路互連 計算機網路可以實現資源共享 資訊傳遞。具有資料通訊 資源共享 增加資料可靠性和提高系統處理能力的功能。網路發展階段 60年代 ...

白話運維003 主機,宿主機,虛擬機器

主機很好理解,是計算機裡除了輸入輸出裝置之外的主要的機體,大概包含以下幾個部分 機箱 主機板 cpu 記憶體 硬碟 顯示卡等。而虛擬機器,顧名思義,虛擬的主機。指通過軟體模擬的具有完整硬體系統功能的 執行在乙個完全隔離環境中的完整計算機系統。兩者之間的根本差別就是乙個是看得見摸得著的,另外乙個存在於...