删除文件中的 BOM 字符

Remove a BOM character in a file

我的 html 文件中有一个 BOM 字符。我想删除它。我已经搜索了很多并使用了很多脚本等等......。但是没有人工作。我也下载了notepad++,但是编码菜单里没有编码"UTF8 without BOM"。我怎样才能删除那个BOM字符?谢谢。

如果您查看相同的菜单。点击"Convert to UTF-8."

您可以使用 vim 解决问题,您可以使用 MinGW-w64(如果您安装了 Git,它会随附)或 Cygwin 轻松获得。

所以,关键是使用:

  • 选项 -s,它将使用 vim 命令执行 vim 脚本。
  • 选项 -b,它将以二进制模式打开您的文件,您会在其中看到那些笨拙的 BOM 字节
  • 选项-n,很重要!此选项拒绝使用交换文件,因此您的所有工作都在内存中运行。它给你保证,因为如果文件很大,交换文件可能会误导进程。

话虽如此,让我们来看看代码吧!

  1. 首先创建一个简单的文件,这里命名为 'script',它将保存 vim 命令

    echo 'gg"+gPggdtCZZ' > script
    

    ...这个奇怪的字符串对 vim " 转到文件的开头,复制第一个单词并将其粘贴到光标后面,删除所有内容,直到字符 'C',然后,保存文件"

    注意:如果您的文件以'C'以外的其他字符开头,您必须指定它。如果您有不同的 'first characters',您可以按照逻辑创建一个 bash 脚本,该脚本将读取第一个字符并在上面的代码段中为您替换它。

  2. 运行 vim 命令:

    vim -n -b <the_file> -s script
    

我相信这不应该被视为问题。当它 一个问题时,BOM 只是 3 个字节 EF BB BF 。我们不能删除这个吗?或者更改为某些内容然后再次关闭文件?

无论如何,下面的这个东西可以解决问题,如果出现在“***”中,可以更改 BOM。 运行 作为

x file 

其中 file 是文件的名称。

#define _CRT_SECURE_NO_WARNINGS     
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
    const unsigned char BOM[3] = { '\xEF', '\xBB', '\xBF' };
    char file_name[64] = { "target.csv" };
    if (argc > 1) strcpy(file_name, argv[1]);
    FILE* one = fopen(file_name, "r+b");
    if (!one) return -1;
    unsigned char buffer[64];
    int n = fread(buffer, 1, 3, one);
    if (n != 3)return -2;
    if (memcmp(buffer, BOM, 3) != 0)
    {   printf("file '%s' has no BOM\n", file_name);
        fclose(one);
        return 0;
    };
    n = fseek(one, 0, SEEK_SET);
    if (n != 0) return -3;
    buffer[0] = buffer[1] = buffer[2] = '*';
    n = fwrite(buffer, 1, 3, one);
    if (n == 3)
        printf("Byte Order Mark changed to '***'\n");
    else
        printf("Error writing to file\n");
    fclose(one);
    return 0;
}