zoukankan      html  css  js  c++  java
  • UTF-8带BOM和不带BOM的转换

    UTF-8带BOM和不带BOM的转换

    标签:Linux UTF-8 BOM


    【问题】

    在linux下如果你使用过的编码不是utf-8你可以使用enca进行转换,然而转换过后的情况是不带bom的uft-8,在windos下我们的编译器采用了msvc2015,而msvc2015不能很好的识别不带bom的utf-8,搞得每次都得使用notepad++打开然后再进行编码转换,可是文件千千万万个...

    【分析问题】

    根据上面的情况,我们可以将这个问题分为两个子问题进行解决:
    问题1.UTF-8带BOM和不带BOM有什么区别?
    问题2.UTF-8带BOM和不带BOM的转化?

    【解决-问题1:UTF-8带BOM和不带BOM有什么区别?】

    (1)打开notepad++,输入123
    (2)菜单栏选择 编码-转为UTF-8无BOM编码格式并进行保存
    (3)菜单栏选择 插件-HEX-Editor-view in HEX (关于插件HEX-Editor的安装可以直接使用插件管理进行安装,unix下面可以直接使用xxd查看)
    (4)可以看到
    no_bom.png

    (5)退出view in HEX
    (6)菜单栏选择 编码-转为UTF-8编码格式并进行保存
    (7)重复步骤(3)(4)可以看到
    bom.png
    Ok,这就知道它们在编码的区别了,理论上的区别呢? 请进行移步到:https://en.wikipedia.org/wiki/Byte_order_mark 进行查看.

    【解决-UTF-8带BOM和不带BOM的转化?】

    废话不多说,利用Linux(笔者此处测试的环境为:Ubuntu12.04)的主要代码如下:

    #clear bom
    sed -i  '1s/^xefxbbxbf//' “$你的输入文件,如:mian.cpp”
    
    #add bom
    sed -I  '1s/^/xefxbbxbf&/' “$你的输入文件,如:mian.cpp”
    

    笔者为了处理一个文件夹下面的代码源文件(.cpp,.h)用了一个函数,当然你也可以直接使用find.

    完整代码如下:

    #!/bin/bash
    add_bom()
    {
        for i in `ls $1`
        do
            current_path=$1/$i
            if [ -d $current_path ]   
            then
                change_code $current_path
            else
              if [ "${current_path##*.}" = "cpp" ] || [ "${current_path##*.}" = "h" ];then
                   #clear bom
                   sed -i  '1s/^xefxbbxbf//' $current_path
    
                   #add bom
                   sed -I  '1s/^/xefxbbxbf&/' $current_path
              fi
            fi
        done
    }
    
    current=`pwd`
    add_bom $current
    

    至此完成,关于直接采用find,待后续有需要再进行补充吧。

    祝:玩得愉快!
  • 相关阅读:
    CVE-2020-1938 Apache-Tomcat-Ajp 文件包含漏洞复现
    关于CVE-2020-0796
    如何伪造邮箱
    如何判断主机是否存在某系统漏洞
    DC3
    小记如何绕过受限的shell
    DC1
    1111. 有效括号的嵌套深度 看题两小时,做题10分钟系列,这是在考语文吧
    LeetCode 912. 排序数组
    LeetCode--算法,简单级别1
  • 原文地址:https://www.cnblogs.com/hejianglin/p/6683074.html
Copyright © 2011-2022 走看看