删除文件中的 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
,很重要!此选项拒绝使用交换文件,因此您的所有工作都在内存中运行。它给你保证,因为如果文件很大,交换文件可能会误导进程。
话虽如此,让我们来看看代码吧!
首先创建一个简单的文件,这里命名为 'script',它将保存 vim 命令
echo 'gg"+gPggdtCZZ' > script
...这个奇怪的字符串对 vim " 转到文件的开头,复制第一个单词并将其粘贴到光标后面,删除所有内容,直到字符 'C',然后,保存文件"
注意:如果您的文件以'C'以外的其他字符开头,您必须指定它。如果您有不同的 'first characters',您可以按照逻辑创建一个 bash 脚本,该脚本将读取第一个字符并在上面的代码段中为您替换它。
运行 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;
}
我的 html 文件中有一个 BOM 字符。我想删除它。我已经搜索了很多并使用了很多脚本等等......。但是没有人工作。我也下载了notepad++,但是编码菜单里没有编码"UTF8 without BOM"。我怎样才能删除那个BOM字符?谢谢。
如果您查看相同的菜单。点击"Convert to UTF-8."
您可以使用 vim 解决问题,您可以使用 MinGW-w64(如果您安装了 Git,它会随附)或 Cygwin 轻松获得。
所以,关键是使用:
- 选项
-s
,它将使用 vim 命令执行 vim 脚本。 - 选项
-b
,它将以二进制模式打开您的文件,您会在其中看到那些笨拙的 BOM 字节 - 选项
-n
,很重要!此选项拒绝使用交换文件,因此您的所有工作都在内存中运行。它给你保证,因为如果文件很大,交换文件可能会误导进程。
话虽如此,让我们来看看代码吧!
首先创建一个简单的文件,这里命名为 'script',它将保存 vim 命令
echo 'gg"+gPggdtCZZ' > script
...这个奇怪的字符串对 vim " 转到文件的开头,复制第一个单词并将其粘贴到光标后面,删除所有内容,直到字符 'C',然后,保存文件"
注意:如果您的文件以'C'以外的其他字符开头,您必须指定它。如果您有不同的 'first characters',您可以按照逻辑创建一个 bash 脚本,该脚本将读取第一个字符并在上面的代码段中为您替换它。
运行 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;
}