【发布时间】:2016-01-04 08:14:37
【问题描述】:
我的 html 文件中有一个 BOM 字符。我想删除它。我已经搜索了很多并使用了很多脚本等......但是没有人工作。我也下载了notepad++,但是它的编码菜单中没有编码“UTF8 without BOM”。如何删除该 BOM 字符?谢谢。
【问题讨论】:
我的 html 文件中有一个 BOM 字符。我想删除它。我已经搜索了很多并使用了很多脚本等......但是没有人工作。我也下载了notepad++,但是它的编码菜单中没有编码“UTF8 without BOM”。如何删除该 BOM 字符?谢谢。
【问题讨论】:
您可以使用 vim 解决问题,您可以使用 MinGW-w64(如果您安装了 Git,它会附带)或 Cygwin 轻松解决问题。
所以,关键是要使用:
-s 选项,它将使用 vim 命令执行 vim 脚本。-b 选项,它将以二进制模式打开您的文件,您会在其中看到那些尴尬的 BOM 字节-n,非常重要!此选项拒绝使用交换文件,因此您的所有工作都在内存中运行。它为您提供保证,因为如果文件很大,交换文件可能会误导该过程。话虽如此,让我们上代码吧!
首先你创建一个简单的文件,这里命名为'script',它将保存vim命令
echo 'gg"+gPggdtCZZ' > script
...这个奇怪的字符串对 vim 说“转到文件的开头,复制第一个单词并将其粘贴到光标后面,因此删除所有字符直到字符 'C',然后,保存文件"
注意:如果您的文件以“C”以外的其他字符开头,则必须指定它。如果你有不同的“第一个字符”,你可以按照逻辑创建一个 bash 脚本,它将读取第一个字符并在上面的 sn-p 中为你替换它。
运行vim命令:
vim -n -b <the_file> -s script
【讨论】:
vim <filename> "+set nobomb" "+wq"。这样,您不必知道文件的第一个可见字符。
vim <filename> "+set nobomb" "+wq" 关于交换文件,当您处理大量大文件(例如超过 10MB)时,vim 在后台使用 .swap 文件而不是原始文件,因此,您经常会被损坏运行所有文件后。因此,解决方案是使用-n 选项将文件直接加载到内存中
我相信这不应被视为问题。当它是有问题时,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;
}
【讨论】: