精华内容
下载资源
问答
  • 带有bom的utf-8
    2021-03-13 03:29:27

    当从http 的response输出CSV文件的时候,设置为utf8的时候默认是不带

    bom的,可是windows的Excel是使用bom来确认utf8编码的,全部须要把bom写到文件的开头。

    微软在 UTF-8 中使用 BOM 是由于这样能够把 UTF-8 和 ASCII 等编码明白区分开。

    否则用Excel打开CSV文件有可能是乱码的

    演示样例代码例如以下:

    response.setContentType("text/csv");

    response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

    response.setCharacterEncoding("UTF-8");

    byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};

    OutputStream out = response.getOutputStream();

    out.write(uft8bom);

    OutputStreamWriter writer = new OutputStreamWriter(out,"UTF-8");

    //write other content ...

    什么是BOM:

    BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。对于UTF-8来说,BOM并非必须的。由于BOM是用来标记多字节编码文件的编码类型和字节顺序(big-endian或little- endian)。

    而UTF8中,每一个字符的编码有多少位是通过第一个字节来表述的。并且没有big-endian和little-endian的区分,见后述。

    BOMs 文件头:

    00 00 FE FF    = UTF-32, big-endian

    FF FE 00 00    = UTF-32, little-endian

    EF BB BF       = UTF-8,

    FE FF          = UTF-16, big-endian

    FF FE          = UTF-16, little-endian

    另一个要注意的是:UTF-8 的网页代码不应使用 BOM。否则经常会出错:

    在网页上使用BOM是个错误。

    BOM设计出来不是用来支持HTML和XML的。要识别文本编码,HTML有charset属性,XML有encoding属性,不是必需拉BOM撑场面。尽管理论上BOM能够用来识别UTF-16编码的HTML页面,但实际project上非常少有人这么干。毕竟UTF-16这样的编码连ASCII都双字节,实在不适用于做网页。

    Windows使用BOM的历史原因:

    通常BOM是用来标示Unicode纯文本字节流的,用来提供一种方便的方法让文本处理程序识别读入的.txt文件是哪个Unicode编码(UTF-8。UTF-16BE,UTF-16LE)。

    Windows相对对BOM处理比較好,是由于Windows把Unicode识别代码集成进了API里。主要是CreateFile()。打开文本文件时它会自己主动识别并剔除BOM。

    Windows用这个有历史原因,由于它最初脱胎于多代码页的环境。而引入Unicode时Windows的设计者又希望能在用户不注意的情况下同一时候兼容Unicode和非Unicode(Multiple byte)文本文件,就仅仅能借助这样的小trick了。

    带BOM的文本文件在Linux/unix环境又经常会遇到问题:

    知乎介绍的非常具体:

    http://www.zhihu.com/question/20167122

    文本文件解析:

    文本文件相应于人类能够阅读的文本,怎样从2进制转换为文本文件呢?起初由于计算机在美国发明。自然大家考虑的是英语怎样表示,英语字母总共26个。加上特殊字符,128个字符,7位既一个byte就可以表示出来。这个就是大家所熟知的ascill编码。

    相应关系非常easy,一个字符相应一一个byte。

    但非常快发现。其它非英语国家的文字远远超过ascill码,这时候大家当然想统一一下。不同国家出了自己不同的编码方式。中国的gb2312就是自己做出来的编码方式,这样下去每一个国家都有自己的编码方式,来回转换太麻烦了。这时候出现了新的编码方式,unicode编码方式,想将编码统一,所以规定了每一个字符相应的unicode码。     1、非常多文件都是ascii编码,假设用unicode 太浪费。

    2、没有标志位说明该几个字节来解析为一个符号。     这时候解救世界的utf出现了。utf是unicode的一种实现,仅仅只是更聪明了。utf16是占用两字节,或者四字节。utf32是占用四字节。

    utf8是非常聪明的一种表示方式。

    1、对于单字节符号,字节第一位为0,后面7位表示字节编码。

    2、对于n字节符号,第一字节的前n位都设为1,第n+1位为0。其余位用于编码。

    对于不同的编码,在文本的最前方有不同的标志,unicode 通常有两位来表示各自是ff fe, 或者feff, fffe表示litte-endian 编码feff表示big-endian编码。

    utf8是efbbbf来开头的。

    能够看出来utf-8是自解释的。所以不用带这个标志文件,大多数程序是能够识别的。

    但有些程序不能识别这个标志,比方php就会直接把这个标志当文本解析,不会忽略。

    更多相关内容
  • 通过java写的UTF-8文件,使用Java可以正确的读,但是...实例:新建一个文本:内容为“测试BOM”的txt文本,另存为UTF-8.处理带BOM的类UnicodeReaderpackage com.java.io;import java.io.IOException;import java....

    通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符,多一个?

    实例:

    新建一个文本:内容为“测试BOM”的txt文本,另存为UTF-8.

    处理带BOM的类UnicodeReaderpackage com.java.io;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.InputStreamReader;

    import java.io.PushbackInputStream;

    import java.io.Reader;

    /**

    version: 1.1 / 2007-01-25

    - changed BOM recognition ordering (longer boms first)

    网络地址:http://koti.mbnet.fi/akini/java/unicodereader/UnicodeReader.java.txt

    Original pseudocode : Thomas Weidenfeller

    Implementation tweaked: Aki Nieminen

    http://www.unicode.org/unicode/faq/utf_bom.html

    BOMs:

    00 00 FE FF = UTF-32, big-endian

    FF FE 00 00 = UTF-32, little-endian

    EF BB BF = UTF-8,

    FE FF = UTF-16, big-endian

    FF FE = UTF-16, little-endian

    Win2k Notepad:

    Unicode format = UTF-16LE

    ***/

    /**

    * Generic unicode textreader, which will use BOM mark

    * to identify the encoding to be used. If BOM is not found

    * then use a given default or system encoding.

    */

    public class UnicodeReader extends Reader {

    PushbackInputStream internalIn;

    InputStreamReader internalIn2 = null;

    String defaultEnc;

    private static final int BOM_SIZE = 4;

    /**

    *

    * @param in inputstream to be read

    * @param defaultEnc default encoding if stream does not have

    * BOM marker. Give NULL to use system-level default.

    */

    UnicodeReader(InputStream in, String defaultEnc) {

    internalIn = new PushbackInputStream(in, BOM_SIZE);

    this.defaultEnc = defaultEnc;

    }

    public String getDefaultEncoding() {

    return defaultEnc;

    }

    /**

    * Get stream encoding or NULL if stream is uninitialized.

    * Call init() or read() method to initialize it.

    */

    public String getEncoding() {

    if (internalIn2 == null) return null;

    return internalIn2.getEncoding();

    }

    /**

    * Read-ahead four bytes and check for BOM marks. Extra bytes are

    * unread back to the stream, only BOM bytes are skipped.

    */

    protected void init() throws IOException {

    if (internalIn2 != null) return;

    String encoding;

    byte bom[] = new byte[BOM_SIZE];

    int n, unread;

    n = internalIn.read(bom, 0, bom.length);

    if ( (bom[0] == (byte)0x00) && (bom[1] == (byte)0x00) &&

    (bom[2] == (byte)0xFE) && (bom[3] == (byte)0xFF) ) {

    encoding = "UTF-32BE";

    unread = n - 4;

    } else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) &&

    (bom[2] == (byte)0x00) && (bom[3] == (byte)0x00) ) {

    encoding = "UTF-32LE";

    unread = n - 4;

    } else if ( (bom[0] == (byte)0xEF) && (bom[1] == (byte)0xBB) &&

    (bom[2] == (byte)0xBF) ) {

    encoding = "UTF-8";

    unread = n - 3;

    } else if ( (bom[0] == (byte)0xFE) && (bom[1] == (byte)0xFF) ) {

    encoding = "UTF-16BE";

    unread = n - 2;

    } else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) ) {

    encoding = "UTF-16LE";

    unread = n - 2;

    } else {

    // Unicode BOM mark not found, unread all bytes

    encoding = defaultEnc;

    unread = n;

    }

    //System.out.println("read=" + n + ", unread=" + unread);

    if (unread > 0) internalIn.unread(bom, (n - unread), unread);

    // Use given encoding

    if (encoding == null) {

    internalIn2 = new InputStreamReader(internalIn);

    } else {

    internalIn2 = new InputStreamReader(internalIn, encoding);

    }

    }

    public void close() throws IOException {

    init();

    internalIn2.close();

    }

    public int read(char[] cbuf, int off, int len) throws IOException {

    init();

    return internalIn2.read(cbuf, off, len);

    }

    }

    测试类

    package com.java.io;

    import java.io.BufferedReader;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.InputStreamReader;

    import java.nio.charset.Charset;

    public class BomRead {

    /**

    * 读带有BOM的UTF-8文件乱码

    * @param args

    */

    public static void main(String[] args)throws Exception {

    File file = new File("E:\\JS_Exercise\\JavaExercise\\BOM.txt");

    FileInputStream in = new FileInputStream(file);

    BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));

    String line = null;

    System.out.println("处理前:");

    while((line = br.readLine()) != null){

    System.out.println(line);

    }

    File file2 = new File("E:\\JS_Exercise\\JavaExercise\\BOM.txt");

    FileInputStream in2 = new FileInputStream(file2);

    BufferedReader br2 = new BufferedReader(new UnicodeReader(in2, "UTF-8"));

    String line2 = null;

    System.out.println("处理后:");

    while((line2 = br2.readLine()) != null){

    System.out.println(line2);

    }

    }

    }

    输出结果

    处理前:

    ?测试BOM

    处理后:

    测试BOM

    另一种解决方式

    从目前来看1.6只是解决了读取带有BOM文件失败的问题,还是不能区别处理有BOM和无BOM的UTF-8编码的文件,从Bug ID:4508058里的描述可以看出,这个问题将作为一个不会修改的问题关闭,对于BOM编码的识别将由应用程序自己来处理,原因可从另处一个bug处查看到,因为Unicode对于BOM的编码的规定可能发生变化。也就是说对于一个UTF-8的文件,应用程序需要知道这个文件有没有写BOM,然后自己决定处理BOM的方式。

    因此在遇到此问题的时候可以特殊问题特殊处理。

    展开全文
  • utf-8带有BOMutf-8的区别

    千次阅读 2020-06-17 08:20:14
    最近在学习处理的过程中,遇到了需要txt转换为csv文件的需求,第一步当然是另存txt为utf-8的格式,但是博主在保存时,发现了utf-8有两种格式,如下图: 怀着满满的好奇心,我查找了一下两者的区别: ...

    最近在学习处理的过程中,遇到了需要txt转换为csv文件的需求,第一步当然是另存txt为utf-8的格式,但是博主在保存时,发现了utf-8有两种格式,如下图:
    保存的两种格式
    怀着求知欲,我查找了一下两者的区别,现汇总如下:

    1. 在UTF-8中,一个汉字占3个字节(一个字符占一个字节)
    2. BOM即byte order mark ,中文名译作“字节顺序标记”。在UCS 编码中有一个叫做 “Zero Width No-Break Space” ,中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。而 FEFF 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符 “Zero Width No-Break Space”。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果收到FFFE,就表明这个字节流是 Little- Endian 的。因此字符 “Zero Width No-Break Space” (“零宽无间断间隔”)又被称作 BOM。UTF-8 不需要 BOM 来表明字节顺序,但可以用 BOM 来表明编码方式。字符 “Zero Width No-Break Space” 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。Windows 就是使用 BOM 来标记文本文件的编码方式的。[百度百科查找]
    3. 不含BOM的UTF-8才是标准形式,UTF-8不需要BOM
    展开全文
  • 原因:关于utf-8编码的txt文件,windows以记事本方式保存时会在第一行最开始处自动加入bom格式的相关信息,大概三个字节!所以java在读取此类文件时第一行时会多出三个不相关的字节,这样对正常的程序产生了不良影响...

    原因:

    关于utf-8编码的txt文件,windows以记事本方式保存时会在第一行最开始处自动加入bom格式的相关信息,大概三个字节!

    所以java在读取此类文件时第一行时会多出三个不相关的字节,这样对正常的程序产生了不良影响!

    解决方法:

    网上有如下解决方法确实可行

    1.使用UltraEdit将上边的txt文件另存为UTF-8无BOM格式;

    2.使用Notepad++打开上边的txt文件执行如下操作“格式-->以UTF-8无BOM格式编码”,修改后将txt文本进行保存

    不足之处:

    但是这样也有不足,这样对文件生产者提出了很高的要求,万一这样的文件是很多人生产的,那就势必会产生各种各样的问题,这归根到底是jdk的一个bug.

    有没有什么办法能够一劳永逸呢,答案是有的,咱们程序里控制,来跟着我一起做!

    终极解决方案:

    (1)在工程中增加JDK提供的一个工具类:

    public class UnicodeInputStream extends InputStream {

    PushbackInputStream internalIn;

    boolean             isInited = false;

    String              defaultEnc;

    String              encoding;

    private static final int BOM_SIZE = 4;

    public UnicodeInputStream(InputStream in, String defaultEnc) {

    internalIn = new PushbackInputStream(in, BOM_SIZE);

    this.defaultEnc = defaultEnc;

    }

    public String getDefaultEncoding() {

    return defaultEnc;

    }

    public String getEncoding() {

    if (!isInited) {

    try {

    init();

    } catch (IOException ex) {

    IllegalStateException ise = new IllegalStateException("Init method failed.");

    ise.initCause(ise);

    throw ise;

    }

    }

    return encoding;

    }

    /**

    * Read-ahead four bytes and check for BOM marks. Extra bytes are

    * unread back to the stream, only BOM bytes are skipped.

    */

    protected void init() throws IOException {

    if (isInited) return;

    byte bom[] = new byte[BOM_SIZE];

    int n, unread;

    n = internalIn.read(bom, 0, bom.length);

    if ( (bom[0] == (byte)0x00) && (bom[1] == (byte)0x00) &&

    (bom[2] == (byte)0xFE) && (bom[3] == (byte)0xFF) ) {

    encoding = "UTF-32BE";

    unread = n - 4;

    } else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) &&

    (bom[2] == (byte)0x00) && (bom[3] == (byte)0x00) ) {

    encoding = "UTF-32LE";

    unread = n - 4;

    } else if (  (bom[0] == (byte)0xEF) && (bom[1] == (byte)0xBB) &&

    (bom[2] == (byte)0xBF) ) {

    encoding = "UTF-8";

    unread = n - 3;

    } else if ( (bom[0] == (byte)0xFE) && (bom[1] == (byte)0xFF) ) {

    encoding = "UTF-16BE";

    unread = n - 2;

    } else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) ) {

    encoding = "UTF-16LE";

    unread = n - 2;

    } else {

    // Unicode BOM mark not found, unread all bytes

    encoding = defaultEnc;

    unread = n;

    }

    //System.out.println("read=" + n + ", unread=" + unread);

    if (unread > 0) internalIn.unread(bom, (n - unread), unread);

    isInited = true;

    }

    public void close() throws IOException {

    //init();

    isInited = true;

    internalIn.close();

    }

    public int read() throws IOException {

    //init();

    isInited = true;

    return internalIn.read();

    }

    }

    (2)读取时使用如下代码:  //因为我这边是服务器上的远程文件,如果是本地文件使用File类

    URL url = new URL("http://****/***/test.txt");

    // File f  = new File("test.txt");

    String enc = null; // or NULL to use systemdefault

    UnicodeInputStream uin = new UnicodeInputStream(url.openStream(),enc);  //如果是本地将url.openStream -> new FileInputStream(f)

    enc = uin.getEncoding(); // check and skip possible BOM bytes

    InputStreamReader in;

    if (enc == null){

    in = new InputStreamReader(uin);

    }else {

    in = new InputStreamReader(uin, enc);

    }

    BufferedReader reader = new BufferedReader(in);

    //BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("D:/tags.txt"),"utf-8"));

    String tmp =reader.readLine();

    这样读取的结果就是正常的了,有什么问题还可以留言!

    展开全文
  • fp = open("file.txt")s = fp.read()u = s.decode("utf-8-sig")这给了您一个没有BOM的unicode字符串。你可以用s = u.encode("utf-8")在s中获取一个普通的UTF-8编码字符串。如果你的文件很大,那么你应该避免将它们...
  • UTF-8和不带BOMUTF-8有什么区别?

    千次阅读 2019-12-20 09:24:02
    没有BOMUTF-8UTF-8有什么区别? 哪个更好?
  • UTF-8UTF-8(BOM)区别和一些说明

    千次阅读 2021-07-31 16:31:19
    写在前面在我们通常使用的...原因在于:此时保存的编码方式自动会变为UTF-8 BOM 一、一个汉字在不同的编码方式中占多少字节?        1.在UTF-8中,一个汉字占3个字节(一个字符占一个字...
  • I have a set of files which are usually UTF-8 with BOM. I'd like to convert them (ideally in place) to UTF-8 with no BOM. It seems like codecs.StreamRecoder(stream, encode, decode,...
  • IDEA支持带BOMUTF-8编码文件.zip,README.md,IDEA支持带BOMUTF-8编码文件.zip
  • Java解决UTF-8BOM问题

    热门讨论 2012-03-16 14:04:41
    Java解决UTF-8BOM问题,使用“UnicodeInputStream”、“UnicodeReader”。
  • 版权声明:本文为博主原创...BOM——Byte Order Mark,就是字节序标记   在UCS 编码中一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在...
  • C#UTF-8-bom转为UTF-8

    2021-07-15 09:37:40
    C#UTF-8-bom转为UTF-8 系统功能是生成个utf-8的xml文件下载到本机,但是用户的系统是Linux,我们的web系统部署到IIS上,生成的XML文件被windows给搞成了utf-8bom,linux又识别不了这种bom. 解决: XmlDocument ...
  • 前提:在Logstash的pipeline.conf配置文件中写了中文注释,然后启动Logstash时报...but are not UTF-8 encoded这个文件不是utf-8格式 网上查了一下是conf配置文件的编码没有设置对,应该设置为无BOM的UTF8格式 ht...
  • UTF-8带BOM格式与UTF-8BOM格式转换

    千次阅读 2021-08-28 10:13:54
    BOM用来标记编码的字节顺序,但是由于编码字节顺序对于UTF-8来说无关紧要,而且Unicode标准也并不推荐使用带BOMUTF-8编码格式。总之,由于Windows和Linux的不同,为避免使用Notepad++手动更改大量文件的繁琐,提供...
  • 简言:在windows上使用open打开utf-8编码的txt文件时开头会一个多余的字符它叫BOM,是用来声明编码等信息的,但python会把它当作文本解析解决办法:open的encoding参数for line in open('data.txt', encoding='utf-8-...
  • PHP处理带有BOMUTF-8文本文件发现问题什么是带BOM的UTF-8文件?解决方案函数介绍最终代码 发现问题 最近在用php读取txt文件时发现一个问题 首先打开并读取了文件: $f = fopen("temp.txt","r"); while(!feof($f)){...
  • import os def convert(d): for f in os.listdir(d): full = os.path.join(d, f) if os.path.isfile(full): ... s = open(full, mode='r', encoding='utf-8-sig').read() open(full, mode='w', encoding='
  • UTF-8 带BOMUTF-8BOM 的区别?

    千次阅读 2019-02-26 17:36:01
    通常,BOM用于表示编码的字节顺序, 但是由于字节顺序与UTF-8无关,因此BOM不是必须的。 根据Unicode标准,不建议使用UTF-8文件的BOM。 常见问题: 从网上下载的excel或者其他文档,csv文件,使用Microsoft Excel...
  • 从txt文件中读取一串字符串和...左边的字符串是数据库的,右边的字符串是从txt文档读取的,发现右边的字符串前个小点。 把整个内容复制粘贴出来,发现那个小点又不见了: E/id===: 55cdf761d9c74874b381d24...
  • 主要介绍了使用python批量转换文件编码为UTF-8的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • package test; import java.io.*; import java.util.ArrayList;... * utf-8有bom 批量转为 utf-8无bom 文件格式 */ public class UTF8BOMConverter extends Reader { private static final i...
  • 而发现群友的电脑,在保持txt文档的时候,自动把编码变成了带有BOMUTF-8编码。把它替换成不带BOM的,就完美解决问题。 什么是带有BOMUTF-8编码格式? BOM(byte-order mark),即字节顺序标记,它是插入到以UTF...
  • 一、需求描述 在我之前的博客: 【我的Android进阶之旅】使用TextAnalysisTool来快速提高你分析文本日志的效率 中介绍下面一个关于中文无法显示的问题,如下所示: ...【使用 UTF-8 BOM编码】,将
  • utf8和utf-8 bom

    2020-12-23 15:42:15
    因为Unicode可以采用16位或者32位编码,所以计算机在处理时需要知道其字节顺序,BOM就是用来标识字节流的字节顺序的,但字节顺序这个 概念对UTF-8来说是没有意义的,所以BOMUTF-8同样没有意义。但Unicode标准却BOM...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,400
精华内容 6,560
关键字:

带有bom的utf-8

友情链接: moxuTest.rar