删除文件中的BOM字符

时间:2015-10-07 07:41:43

标签: notepad++ byte-order-mark

我的html文件中有BOM字符。我想删除它。我经常搜索并使用了很多脚本等等。但没有人工作。我也下载了notepad ++,但没有编码" UTF8没有BOM"在其编码菜单中。如何删除该BOM字符?感谢。

The screenshot of my notepad++

3 个答案:

答案 0 :(得分:26)

如果您查看相同的菜单。单击“转换为UTF-8。”

If you look in the same menu. Click "Convert to UTF-8.

答案 1 :(得分:4)

你可以使用vim解决问题,你可以轻松使用MinGW-w64(如果你已经安装了Git)或者Cygwin。

所以,关键是使用:

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

那就是说,让我们去看代码吧!

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

    vim -n -b <the_file> -s script
    

    ...这个奇怪的字符串告诉vim&#34; 转到文件的开头,复制第一个单词并将其粘贴到光标后面,所以删除所有内容直到字符&#39; C&#39 ;然后,保存文件&#34;

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

  2. 运行vim命令:

    {
        "VCAP_SERVICES": {
            "mongodb": [
                {
                    "credentials": {
                        "hostname": "10.11.241.1",
                        "ports": {
                            "27017/tcp": "43417",
                            "28017/tcp": "43135"
                        },
                        "port": "43417",
                        "username": "xxxxxxxxxx",
                        "password": "xxxxxxxxxx",
                        "dbname": "gwkp7glhw9tq9cwp",
                        "uri": "xxxxxxxxxx"
                    },
                    "syslog_drain_url": null,
                    "volume_mounts": [],
                    "label": "mongodb",
                    "provider": null,
                    "plan": "v3.0-container",
                    "name": "mongodb-business-configuration",
                    "tags": [
                        "mongodb",
                        "document"
                    ]
                }
            ]
        }
    }
    {
        "VCAP_APPLICATION": {
            "cf_api": "xxxxxxxxxx",
            "limits": {
                "fds": 16384,
                "mem": 1024,
                "disk": 1024
            },
            "application_name": "mock-service",
            "application_uris": [
                "xxxxxxxxxx"
            ],
            "name": "mock-service",
            "space_name": "xxxxxxxxxx",
            "space_id": "xxxxxxxxxx",
            "uris": [
                "xxxxxxxxxx"
            ],
            "users": null,
            "application_id": "xxxxxxxxxx",
            "version": "c7569d23-f3ee-49d0-9875-8e595ee76522",
            "application_version": "c7569d23-f3ee-49d0-9875-8e595ee76522"
        }
    }
    

答案 2 :(得分:0)

我认为这不应该成为问题。 时,问题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;
}