2017-04-09 79 views
1

我正在使用Ubuntu 16.我發現編輯器在文本中添加了額外的字節(UTF-8)。當我嘗試通過測試時,它給我帶來了一些問題。爲什麼每個編輯器都會寫入額外的字節(UTF-8)?

所以我們在UTF-8中有大小= 10字節的字符串「額外字節」。 當我嘗試通過gedit將其寫入文件時,例如,我得到大小= 11字節的文件。納米也具有相同的尺寸。即使「回聲」額外字節「>文件名」返回11個字節。

然而,當我們試圖水木清華這樣的:

#include <fstream> 

int main(){ 
    std::ofstream file("filename"); 

    file<<"Extra byte"; 
    return 0; 
} 

或本:

with open("filename_py",'w+',encoding='UTF-8') as file: 
    file.write('Extra byte') 

我們得到與大小= 10個字節的文件。爲什麼? 謝謝。

+0

你如何檢查文件的大小?並且該命令行'echo'命令添加*換行符*。也許這就是你看到的「額外字節」? –

+0

xxd文件,看看它是什麼。 – chris

+0

xxd告訴額外的字符是換行符。但爲什麼每個編輯都會換一個換行符? – Sklert

回答

1

你看到一個newline character(通常在編程語言如\n表示,在ASCII碼是十六進制0A,十進制10):

$ echo 'foo' > /tmp/test.txt 
$ xxd /tmp/test.txt 
00000000: 666f 6f0a        foo. 

hex-dump tool xxd表示該文件由4個字節,十六進制66(ASCII小寫字母f),兩次六角65(小寫字母o)和換行符。

可以使用-n命令行開關禁用添加新行:

$ echo -n 'foo' > /tmp/test.txt 
$ xxd /tmp/test.txt 
00000000: 666f 6f         foo 

,或者您可以使用printf,而不是(這是更符合POSIX標準):

$ printf 'foo' > /tmp/test.txt 
$ xxd /tmp/test.txt 
00000000: 666f 6f         foo 

另見'echo' without newline in a shell script

大多數文本編輯器也會在文件末尾添加換行符;如何防止這取決於確切的編輯器(通常您可以在保存之前在文件末尾使用delete)。在事實之後還有各種命令行選項來刪除換行符,請參閱How can I delete a newline if it is the last character in a file?

文本編輯器通常添加一個新行,因爲他們應對文本行和POSIX標準定義了text lines end with a newline

3.206線
的零個或多個非<newline>字符的序列加終止<newline>字符。

另見Why should text files end with a newline?

+0

太棒了!謝謝! – Sklert

1

包括gedit和nano在內的許多編輯器都具有在文件末尾添加換行符的功能。 std::ofstream沒有此功能,因爲它用於寫入非文本文件以及文本文件。

該功能的存在是因爲如POSIX定義的,文本文件由行組成,根據定義,一行以換行符結束。

3.206線

的零個或多個非<newline>字符加上終止<newline>字符序列。

3.403文本文件

包含組織成零個或多個行字符的文件。這些行不包含NUL字符,並且都不能超過{LINE_MAX}個字節,包括<newline>字符。儘管POSIX.1-2008沒有區分文本文件和二進制文件(請參閱ISO C標準),但許多實用程序僅在文本文件上操作時纔會產生可預測或有意義的輸出。具有此類限制的標準實用程序始終在STDIN或INPUT FILES部分中指定「文本文件」。

+0

謝謝!非常好的解釋! – Sklert

相關問題