为什么每个编辑器都写入额外的字节(UTF-8)?

时间:2017-04-09 12:48:02

标签: linux gedit nano

我正在研究Ubuntu 16.我发现编辑器会在文本中写入额外的字节(UTF-8)。当我试图通过测试时,它给我带来了一些问题。

因此我们在UTF-8中使用大小为10字节的字符串“Extra byte”。 例如,当我尝试用gedit在文件中写入时,我得到的文件大小= 11字节。纳米也是相同的尺寸。甚至“echo”Extra byte“> filename”返回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')

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

2 个答案:

答案 0 :(得分:1)

许多编辑器(包括gedit和nano)都有一个功能,可以在文件末尾添加换行符。 std::ofstream没有此功能,因为它用于编写非文本文件和文本文件。

该功能的存在是因为POSIX定义的文本文件由行组成,根据定义,行以换行符结束。

  

3.206行

     

一系列零个或多个非<newline>字符加上终止<newline>字符。

     

3.403文本文件

     

包含按零行或多行组织的字符的文件。这些行不包含NUL字符,并且任何行都不能超过{LINE_MAX}个字节,包括<newline>个字符。尽管POSIX.1-2008不区分文本文件和二进制文件(请参阅ISO C标准),但许多实用程序在操作文本文件时仅产生可预测或有意义的输出。具有此类限制的标准实用程序始终在其STDIN或INPUT FILES部分中指定“文本文件”。

答案 1 :(得分: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

大多数文本编辑器还会在文件末尾添加换行符;如何防止这种情况取决于确切的编辑器(通常你可以在保存之前使用文件末尾的删除)。事后还有各种命令行选项可以删除换行符,请参阅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?