如何編輯一份兼容性好的 TXT 文檔?

兼容性好,一是指 TXT 的不可見符號顯示一致,二是指對大眾軟體可顯示。

①:不可見符號:空格、製表符、換行符、UTF-8 BOM

②:大眾軟體,即使用率高的有用戶界面的文本編輯軟體,如Windows記事本Notepad++(跨平台)、Vim(跨平台)、諸移動設備文本閱讀器諸在線預覽服務及編輯器……

具體示例1

這一張是無意發現的,截圖網頁地址為: http://http://zhidao.baidu.com/question...

其中有兩個問題

①網頁有一個空換行,複製到Notepad++里為兩個,記事本中為一個。

②新段落起始,網頁為一個漢字空格,複製到Notepad++中亦為一個漢字空格,但是是在上個換行後(不顯示所有字元狀態下),記事本是兩個漢字空格。

具體示例2

兩張圖片的具體截圖名稱依次是「記事本下一致對齊對比」和「Notepad++下一致對齊對比」。

上邊記事本的字體為宋體,Notepad++的字體為Georgia。

示例情況並不是非常典型的兼容情況,因為我以前沒有收集這類問題,所以……非常抱歉。

如果有知友有更普遍的兼容問題,可替換之。


世界上最通用的純文本編碼方式是:

  • UTF-8 無 BOM [1]

  • Unix 風格換行符(LF)

但,注意:

因為 Windows 等操作系統使用 CR+LF 作換行符,所以以 LF 作換行符的純文本文件在 Windows 記事本之類的編輯器下會顯示不出換行。

而 Linux 和 Mac OS X 用 LF。

所以你在 Windows 上應該用能選擇換行符模式的編輯器(比如 Notepad++)。

但如果你真的必須用要求 CR+LF 的軟體查看,就統一用 CR+LF 吧。在 Linux 的文本編輯器里也能選擇換行符模式的。

/* @余天升 提到的 CR 僅僅是 Mac OS Classic 用的換行符,而 Mac OS X 遵循 Unix 標準完全使用 LF。要注意區分。*/

不要用 GB 2312 / GBK / GB 18030 這些蛋疼的專有編碼。用 UTF-8。

永遠不要用 Windows 的記事本去編輯需要跨平台使用的純文本文件。記事本是垃圾。它會給 UTF-8 編碼的文件加上 BOM [1],而且無法控制換行符模式。你既然有 Notepad++,為什麼還要用記事本?

空格的寬度和字體有關。如果是等寬西文字體,那空格就和西文字母一樣寬,但等寬西文字體的西文字母寬度不一定是當前環境下中文字體漢字寬度的一半。如果不是等寬西文字體,那空格的寬度就和西文字母都不一樣寬。記事本處理不好字體。不要用記事本。

製表符的寬度天生不會在各處一致,因為一個製表符等於多少個空格是由各文本編輯器自行定義的參數。2、4、8……都是常見的數值。如果你很在意製表符在記事本之類不可控環境下的效果,就用空格來代替製表符——這也是程序員間從未停歇的「製表符—空格聖戰」中空格一方的主要論點。但此時你的純文本文件必須用等寬西文字體顯示。

純文本文件天生就不能精確描述格式。如果你需要精確的格式,用 PDF。如果你需要清晰的結構,用 HTML。

[1] 「帶 BOM 的 UTF-8」和「無 BOM 的 UTF-8」有什麼區別? http://www.zhihu.com/question/20167122

* * *

補充,關於空格:

唉我真是不太理解用 Notepad++ 的人怎麼會不知道等寬字體是什麼……我都不知道該怎麼說了……而且我在上面的答案里已經解釋過了,還要怎麼解釋……(攤手……)

  • 如果你要用空格排版(比如寫代碼時用空格縮進),那麼必須用等寬字體(monospace font),否則空格的寬度和西文字母(英文字母)不一樣——寬度都不一樣你怎麼對齊?亂對齊嗎?!

  • 即使用了等寬字體,等寬字體里西文和空格的寬度也不一定就是漢字寬度的一半——空格寬度都不是漢字的一半你怎麼對齊?!
  • Georgia 不是等寬字體。
  • 用空格排版僅僅在全西文(英文)的代碼之類環境下才算是好用。我不建議用空格來處理中西文混排的文本排版,因為西文字體的空格寬度(即使等寬字體)和漢字的寬度關係難以預測。
  • 編輯器里,如果你只設定了西文字體,那麼空格、西文標點、西文字母之類的字元會用西文字體顯示,而漢字之類的字元會 fallback 到系統默認的中文字體來顯示——比如 Windows 自帶的中易宋體(宋體、SimSun)。
  • 唉我不想解釋這個問題了……好麻煩……求饒……


TXT 很難存在所謂好的兼容性,因為 TXT 兼容性的問題取決於你是否有一個靠譜的閱讀器,以及你對閱讀文檔的程序進行了什麼樣的設定(例如,設定為等寬字體)。

如果需要去找 TXT 文檔的樣本的話,RFC 可以說是個非常好的資源來源:

http://www.ietf.org/download/rfc-index.txt

因為 RFC 可以說是在被廣泛流傳的文檔中,堅持使用 txt 格式的典型代表。

其他的我就不多說了。簡單點評一下幾點:

1。使用單 LF 換行符。

這是必須的,因為除了 Windows 記事本以外幾乎所有程序都支持這種格式。

但是 CR-LF 卻面對相當多的 Linux/OSX 應用程序會出問題。

2。OSX中的 X 代表著羅馬數字的十,之前的系統是 MacOS 9 ,那是個內核與體系都完全不同的操作系統,而且現在已經淘汰,不需要再考慮 OS9 的那種怪異換行符。

3。等寬字體,等寬字體不但需要每個字元一樣的寬度,還需要所有的雙寬度字元正好是單寬度字元兩倍寬度。這一點對於 Windows 系統來說一般要對你的字體或者編輯器進行一些設定才可能完美實現。


你先說清楚,這個文件是給用戶在編輯器裡面看(如電子書),還是用來丟給程序處理。

前者,UTF-16LE+BOM,CRLF 斷行

後者,UTF-8,LF 斷行


  1. 編輯時使用等寬英文字體,不使用全形的英文字母;
  2. 使用UTF-8(無BOM)編碼,但注意:UTF-8 在不支持非英文語言的系統中,可能會當作ISO-8859-x被顯示為亂碼,不過行列關係可以保持不變;大陸GB系列和對岸的BIG5編碼不保證一定識別;UTF-16之類的在不支持寬字元的系統裡面可能會被截斷;
  3. 換行符使用CR+LF("
    ");
  4. 使用空格,不使用製表符( 和f),因為製表符的寬度,不同的編輯器裡面設置都不一樣;
  5. 不使用自動換行,每一行末尾手工換行,每行不超過80列,即80個英文字元寬度,漢字按兩個字元寬度計算;

按照以上規定,基本可以保證不管在什麼環境中,在GUI中還是終端里,看到的結果都是一樣的。

如果你使用UNIX風格換行符LF(即
)作為換行符,在Windows的記事本中是絕對不能正常顯示的,如果你想寫一個兼容性非常好的,請使用Windows風格的換行符CR+LF。Linux下的文本編輯器都能自動檢測各種不同類型的換行符,所以不必擔心。

&另外,Mac OS X使用的換行符跟別人的都不一樣,是CR(
),而不是@梁海 所說的LF。&
(見評論,現在使用LF)

純文本可以通過空格很精確的描述格式,只是不適合描述豐富多彩的文本形式罷了。用來承載一些文字性的東西,比如諸如README或者LICENSE這樣的幫助性的文檔,再合適不過了,保證你可以在任意一種環境裡面可以打開來閱讀(在終端中,PDF就是妄想)。

如果想表達一些複雜的內容,請使用PDF或者HTML。

--------

如圖,這個不是跟打開的程序有關係,顯示的時候用的字體有關係,非等寬字體裡面的非漢字字元,永遠不能保證有多寬,各個字體都不一樣。所以,達不到你想要的要求。詳細狀況,我了解的比較少,請@梁海 同學介紹。


或許Markdown是一個不錯的想法!


推薦閱讀:

mdx轉換txt的問題?

TAG:文本編輯器 | 軟體兼容 | 文本文檔TXT |