为什么每个文本编辑器都要写入一个附加字节 (UTF-8)?

Skl*_*ert 3 linux gedit nano

我正在使用Ubuntu 16.04 (Xenial Xerus)。我发现文本编辑器会向文本文件写入额外的字节 (UTF-8)。当我试图通过测试时,这给我带来了一些问题。

因此,我们有一个字符串“Extra byte”,其大小为 UTF-8 格式的 10 个字节。例如,当我尝试通过gedit将其写入文件时,我得到一个大小为 11 字节的文件。此外,nano 的尺寸相同。即使“echo“额外字节”> 文件名”也会返回 11 个字节。

然而,当我们尝试这样的事情时:

#include <fstream>

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

    file<<"Extra byte";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或这个:

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

我们得到大小 = 10 字节的文件。为什么?

Mar*_*ers 5

您看到一个换行符(通常在编程语言中表示为\n,在 ASCII 中是十六进制 0a,十进制 10):

$ echo 'foo' > /tmp/test.txt
$ xxd /tmp/test.txt
00000000: 666f 6f0a                                foo.
Run Code Online (Sandbox Code Playgroud)

hex-dump工具xxd显示该文件由4个字节组成,十六进制66(ASCII小写字母f),两倍十六进制65(小写字母o)和换行符。

您可以使用-n命令行开关来禁用添加换行符:

$ echo -n 'foo' > /tmp/test.txt
$ xxd /tmp/test.txt
00000000: 666f 6f                                  foo
Run Code Online (Sandbox Code Playgroud)

或者您可以使用printf(更符合 POSIX 标准):

$ printf 'foo' > /tmp/test.txt
$ xxd /tmp/test.txt
00000000: 666f 6f                                  foo
Run Code Online (Sandbox Code Playgroud)

另请参阅shell 脚本中不带换行符的“echo”

大多数文本编辑器还会在文件末尾添加换行符;如何防止这种情况取决于确切的编辑器(通常您可以在保存之前在文件末尾使用删除)。还有各种命令行选项可以在事后删除换行符,请参阅如何删除换行符(如果它是文件中的最后一个字符)?

文本编辑器通常会添加换行符,因为它们处理文本行,并且 POSIX 标准定义文本行以换行符结尾

3.206 行由零个或多个非字符加上一个终止字符组成的
序列。<newline><newline>

另请参阅为什么文本文件应以换行符结尾?