`
langgufu
  • 浏览: 2306969 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)

阅读更多

原文地址:http://blog.csdn.net/jackpk/article/details/5702964/

 

Java读取UTF-8的txt文件第一行出现乱码“?”及解决


test.txt文件内容:
A中
2国
3
4
5
6

 

test.txt文件采用写字板保存为UTF-8格式
保存并关闭后使用写字板再次打开该UTF-8文档,中文、字母正常显示

 

测试代码:

 

[java] view plaincopy
  1. import java.io.BufferedReader;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.InputStreamReader;  
  5.   
  6. public class ReadTxtFile {  
  7.   
  8.     public static void main(String[] args) {  
  9.         try {  
  10.             String charsetName = "UTF-8";   
  11.             String path = "D:/to_delete/test.txt";  
  12.   
  13.             File file = new File(path);  
  14.             if (file.isFile() && file.exists())   
  15.             {  
  16.                 InputStreamReader insReader = new InputStreamReader(  
  17.                         new FileInputStream(file), charsetName);  
  18.   
  19.                 BufferedReader bufReader = new BufferedReader(insReader);  
  20.   
  21.                 String line = new String();  
  22.                 while ((line = bufReader.readLine()) != null) {  
  23.                     System.out.println(line);  
  24.                 }  
  25.                 bufReader.close();  
  26.                 insReader.close();  
  27.             }  
  28.   
  29.         } catch (Exception e) {  
  30.             System.out.println("读取文件内容操作出错");  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34.   
  35. }  

 

 

程序执行结果:
?A中
2国
3
4
5
6

 

我的解决办法:

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

或者

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

 

 

 

网上有篇非常好的文章,论述了问题出现的原因及解决办法

Java读带有BOM的UTF-8文件乱码原因及解决方法

 

url:http://daimojingdeyu.javaeye.com/blog/397661

 

关键字: java 读utf-8, java写utf-8, 编码, utf-8 乱码

最近在处理文件时发现了同样类型的文件使用的编码可能是不同的。所以想将文件的格式统一一下(因为UTF-8的通用性,决定往UTF-8统一),遇见的第一个问题是:如何查看现有文件的编码方式。 

上网找了一下,找到几篇比较好文章,这里就不转载啦把链接搞过来。 
文件编码问题集锦 
字符串编码(charset,encoding,decoding)问题原理 
Java编码浅析 
判定文件编码或文本流编码的方法 
上面的几篇文章可以看成认识编码问题的“从入门到精通” 

如果你看完了上面的文章,一定了解到了,在java中,class文件采用utf8的编码方式,JVM运行时采用utf16。Java的字符串是永远都是unicode的,采用的是UTF-16的编码方式。 

想测试一下,java对UTF-8文件的读写的能力,结果发现了一个很郁闷的问题,如果通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符。 
测试代码如下: 
Java代码 复制代码
  1.   
  2. import java.io.BufferedReader;   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.IOException;   
  6. import java.io.InputStreamReader;   
  7.   
  8.   
  9. public class UTF8Test {   
  10.     public static void main(String[] args) throws IOException {   
  11.         File f  = new File("./utf.txt");   
  12.         FileInputStream in = new FileInputStream(f);   
  13.         // 指定读取文件时以UTF-8的格式读取   
  14.         BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));   
  15.            
  16.         String line = br.readLine();   
  17.         while(line != null)   
  18.         {   
  19.             System.out.println(line);   
  20.             line = br.readLine();   
  21.         }   
  22.     }   
  23. }  
utf.txt通过记事本创建,另存时使用指定utf-8编码,其内容为: 
引用

This is the first line. 
This is second line. 

正常的测试结果应该是直接输出utf.txt的文本内容。可是实际上却输出了下面的内容: 
引用

?This is the first line. 
This is second line. 

第一行多出了一个问号。 
通过上面的几篇文章应该可以想到是Java读取BOM(Byte Order Mark)的问题,在使用UTF-8时,可以在文件的开始使用3个字节的"EF BB BF"来标识文件使用了UTF-8的编码,当然也可以不用这个3个字节。 
上面的问题应该就是因为对开头3个字节的读取导致的。开始不太相信这个是JDK的Bug,后来在多次试验后,问题依然存在,就又狗狗了一下,果然找到一个如下的Bug: 
Bug ID:4508058 
不过在我关掉的一些页面中记得有篇文件说这个bug只在jdk1.5及之前的版本才有,说是1.6已经解决了,从目前来看1.6只是解决了读取带有BOM文件失败的问题,还是不能区别处理有BOM和无BOM的UTF-8编码的文件,从Bug ID:4508058里的描述可以看出,这个问题将作为一个不会修改的问题关闭,对于BOM编码的识别将由应用程序自己来处理,原因可从另处一个bug处查看到,因为Unicode对于BOM的编码的规定可能发生变化。也就是说对于一个UTF-8的文件,应用程序需要知道这个文件有没有写BOM,然后自己决定处理BOM的方式。 

在上面的while循环中可加入下面的代码,测试一下读出内容: 
Java代码 复制代码
  1. byte[] allbytes = line.getBytes("UTF-8");    
  2.             for (int i=0; i < allbytes.length; i++)   
  3.             {   
  4.                 int tmp = allbytes[i];   
  5.                 String hexString = Integer.toHexString(tmp);   
  6.                 // 1个byte变成16进制的,只需要2位就可以表示了,取后面两位,去掉前面的符号填充   
  7.                 hexString = hexString.substring(hexString.length() -2);   
  8.                 System.out.print(hexString.toUpperCase());   
  9.                 System.out.print(" ");   
  10.             }  
输出结果如下: 
引用

EF BB BF 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6C 69 6E 65 2E 
?This is the first line. 
54 68 69 73 20 69 73 20 73 65 63 6F 6E 64 20 6C 69 6E 65 2E 
This is second line. 


红色部分的"EF BB BF"刚好是UTF-8文件的BOM编码,可以看出Java在读文件时没能正确处理UTF-8文件的BOM编码,将前3个字节当作文本内容来处理了。 

使用链接中提供的代码可以解决碰到的乱码问题: 
http://koti.mbnet.fi/akini/java/unicodereader/ 

修改测试代码中的输入流后: 
Java代码 复制代码
  1. BufferedReader br = new BufferedReader(new UnicodeReader(in, Charset.defaultCharset().name()));  
执行,可以看到正确的结果。 

将用到的测试代码及UTF-8读取乱码解决(http://koti.mbnet.fi/akini/java/unicodereader)的源码放在了附件中 

 

 

压缩包中的源代码

UnicodeInputStream.java

 

[java] view plaincopy
  1. /** 
  2.  version: 1.1 / 2007-01-25 
  3.  - changed BOM recognition ordering (longer boms first) 
  4.  
  5.  Original pseudocode   : Thomas Weidenfeller 
  6.  Implementation tweaked: Aki Nieminen 
  7.  
  8.  http://www.unicode.org/unicode/faq/utf_bom.html 
  9.  BOMs in byte length ordering: 
  10.    00 00 FE FF    = UTF-32, big-endian 
  11.    FF FE 00 00    = UTF-32, little-endian 
  12.    EF BB BF       = UTF-8, 
  13.    FE FF          = UTF-16, big-endian 
  14.    FF FE          = UTF-16, little-endian 
  15.  
  16.  Win2k Notepad: 
  17.    Unicode format = UTF-16LE 
  18.  ***/  
  19.   
  20. import java.io.*;  
  21.   
  22. /** 
  23.  * This inputstream will recognize unicode BOM marks and will skip bytes if 
  24.  * getEncoding() method is called before any of the read(...) methods. 
  25.  *  
  26.  * Usage pattern: String enc = "ISO-8859-1"; // or NULL to use systemdefault 
  27.  * FileInputStream fis = new FileInputStream(file); UnicodeInputStream uin = new 
  28.  * UnicodeInputStream(fis, enc); enc = uin.getEncoding(); // check and skip 
  29.  * possible BOM bytes InputStreamReader in; if (enc == null) in = new 
  30.  * InputStreamReader(uin); else in = new InputStreamReader(uin, enc); 
  31.  */  
  32. public class UnicodeInputStream extends InputStream {  
  33.     PushbackInputStream internalIn;  
  34.     boolean isInited = false;  
  35.     String defaultEnc;  
  36.     String encoding;  
  37.   
  38.     private static final int BOM_SIZE = 4;  
  39.   
  40.     UnicodeInputStream(InputStream in, String defaultEnc) {  
  41.         internalIn = new PushbackInputStream(in, BOM_SIZE);  
  42.         this.defaultEnc = defaultEnc;  
  43.     }  
  44.   
  45.     public String getDefaultEncoding() {  
  46.         return defaultEnc;  
  47.     }  
  48.   
  49.     public String getEncoding() {  
  50.         if (!isInited) {  
  51.             try {  
  52.                 init();  
  53.             } catch (IOException ex) {  
  54.                 IllegalStateException ise = new IllegalStateException(  
  55.                         "Init method failed.");  
  56.                 ise.initCause(ise);  
  57.                 throw ise;  
  58.             }  
  59.         }  
  60.         return encoding;  
  61.     }  
  62.   
  63.     /** 
  64.      * Read-ahead four bytes and check for BOM marks. Extra bytes are unread 
  65.      * back to the stream, only BOM bytes are skipped. 
  66.      */  
  67.     protected void init() throws IOException {  
  68.         if (isInited)  
  69.             return;  
  70.   
  71.         byte bom[] = new byte[BOM_SIZE];  
  72.         int n, unread;  
  73.         n = internalIn.read(bom, 0, bom.length);  
  74.   
  75.         if ((bom[0] == (byte0x00) && (bom[1] == (byte0x00)  
  76.                 && (bom[2] == (byte0xFE) && (bom[3] == (byte0xFF)) {  
  77.             encoding = "UTF-32BE";  
  78.             unread = n - 4;  
  79.         } else if ((bom[0] == (byte0xFF) && (bom[1] == (byte0xFE)  
  80.                 && (bom[2] == (byte0x00) && (bom[3] == (byte0x00)) {  
  81.             encoding = "UTF-32LE";  
  82.             unread = n - 4;  
  83.         } else if ((bom[0] == (byte0xEF) && (bom[1] == (byte0xBB)  
  84.                 && (bom[2] == (byte0xBF)) {  
  85.             encoding = "UTF-8";  
  86.             unread = n - 3;  
  87.         } else if ((bom[0] == (byte0xFE) && (bom[1] == (byte0xFF)) {  
  88.             encoding = "UTF-16BE";  
  89.             unread = n - 2;  
  90.         } else if ((bom[0] == (byte0xFF) && (bom[1] == (byte0xFE)) {  
  91.             encoding = "UTF-16LE";  
  92.             unread = n - 2;  
  93.         } else {  
  94.             // Unicode BOM mark not found, unread all bytes  
  95.             encoding = defaultEnc;  
  96.             unread = n;  
  97.         }  
  98.         // System.out.println("read=" + n + ", unread=" + unread);  
  99.   
  100.         if (unread > 0)  
  101.             internalIn.unread(bom, (n - unread), unread);  
  102.   
  103.         isInited = true;  
  104.     }  
  105.   
  106.     public void close() throws IOException {  
  107.         // init();  
  108.         isInited = true;  
  109.         internalIn.close();  
  110.     }  
  111.   
  112.     public int read() throws IOException {  
  113.         // init();  
  114.         isInited = true;  
  115.         return internalIn.read();  
  116.     }  
  117. }  

 

 

 

UnicodeReader.java

 

 

[java] view plaincopy
  1. /** 
  2.  version: 1.1 / 2007-01-25 
  3.  - changed BOM recognition ordering (longer boms first) 
  4.  
  5.  Original pseudocode   : Thomas Weidenfeller 
  6.  Implementation tweaked: Aki Nieminen 
  7.  
  8.  http://www.unicode.org/unicode/faq/utf_bom.html 
  9.  BOMs: 
  10.    00 00 FE FF    = UTF-32, big-endian 
  11.    FF FE 00 00    = UTF-32, little-endian 
  12.    EF BB BF       = UTF-8, 
  13.    FE FF          = UTF-16, big-endian 
  14.    FF FE          = UTF-16, little-endian 
  15.  
  16.  Win2k Notepad: 
  17.    Unicode format = UTF-16LE 
  18.  ***/  
  19.   
  20. import java.io.*;  
  21.   
  22. /** 
  23.  * Generic unicode textreader, which will use BOM mark to identify the encoding 
  24.  * to be used. If BOM is not found then use a given default or system encoding. 
  25.  */  
  26. public class UnicodeReader extends Reader {  
  27.     PushbackInputStream internalIn;  
  28.     InputStreamReader internalIn2 = null;  
  29.     String defaultEnc;  
  30.   
  31.     private static final int BOM_SIZE = 4;  
  32.   
  33.     /** 
  34.      *  
  35.      * @param in 
  36.      *            inputstream to be read 
  37.      * @param defaultEnc 
  38.      *            default encoding if stream does not have BOM marker. Give NULL 
  39.      *            to use system-level default. 
  40.      */  
  41.     UnicodeReader(InputStream in, String defaultEnc) {  
  42.         internalIn = new PushbackInputStream(in, BOM_SIZE);  
  43.         this.defaultEnc = defaultEnc;  
  44.     }  
  45.   
  46.     public String getDefaultEncoding() {  
  47.         return defaultEnc;  
  48.     }  
  49.   
  50.     /** 
  51.      * Get stream encoding or NULL if stream is uninitialized. Call init() or 
  52.      * read() method to initialize it. 
  53.      */  
  54.     public String getEncoding() {  
  55.         if (internalIn2 == null)  
  56.             return null;  
  57.         return internalIn2.getEncoding();  
  58.     }  
  59.   
  60.     /** 
  61.      * Read-ahead four bytes and check for BOM marks. Extra bytes are unread 
  62.      * back to the stream, only BOM bytes are skipped. 
  63.      */  
  64.     protected void init() throws IOException {  
  65.         if (internalIn2 != null)  
  66.             return;  
  67.   
  68.         String encoding;  
  69.         byte bom[] = new byte[BOM_SIZE];  
  70.         int n, unread;  
  71.         n = internalIn.read(bom, 0, bom.length);  
  72.   
  73.         if ((bom[0] == (byte0x00) && (bom[1] == (byte0x00)  
  74.                 && (bom[2] == (byte0xFE) && (bom[3] == (byte0xFF)) {  
  75.             encoding = "UTF-32BE";  
  76.             unread = n - 4;  
  77.         } else if ((bom[0] == (byte0xFF) && (bom[1] == (byte0xFE)  
  78.                 && (bom[2] == (byte0x00) && (bom[3] == (byte0x00)) {  
  79.             encoding = "UTF-32LE";  
  80.             unread = n - 4;  
  81.         } else if ((bom[0] == (byte0xEF) && (bom[1] == (byte0xBB)  
  82.                 && (bom[2] == (byte0xBF)) {  
  83.             encoding = "UTF-8";  
  84.             unread = n - 3;  
  85.         } else if ((bom[0] == (byte0xFE) && (bom[1] == (byte0xFF)) {  
  86.             encoding = "UTF-16BE";  
  87.             unread = n - 2;  
  88.         } else if ((bom[0] == (byte0xFF) && (bom[1] == (byte0xFE)) {  
  89.             encoding = "UTF-16LE";  
  90.             unread = n - 2;  
  91.         } else {  
  92.             // Unicode BOM mark not found, unread all bytes  
  93.             encoding = defaultEnc;  
  94.             unread = n;  
  95.         }  
  96.         // System.out.println("read=" + n + ", unread=" + unread);  
  97.   
  98.         if (unread > 0)  
  99.             internalIn.unread(bom, (n - unread), unread);  
  100.   
  101.         // Use given encoding  
  102.         if (encoding == null) {  
  103.             internalIn2 = new InputStreamReader(internalIn);  
  104.         } else {  
  105.             internalIn2 = new InputStreamReader(internalIn, encoding);  
  106.         }  
  107.     }  
  108.   
  109.     public void close() throws IOException {  
  110.         init();  
  111.         internalIn2.close();  
  112.     }  
  113.   
  114.     public int read(char[] cbuf, int off, int len) throws IOException {  
  115.         init();  
  116.         return internalIn2.read(cbuf, off, len);  
  117.     }  
  118.   
  119. }  

 

 

UTF8Test.java

 

[java] view plaincopy
  1. import java.io.BufferedReader;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.nio.charset.Charset;  
  7.   
  8.   
  9. public class UTF8Test {  
  10.     public static void main(String[] args) throws IOException {  
  11.         File f  = new File("./utf.txt");  
  12.         FileInputStream in = new FileInputStream(f);  
  13.         // 指定读取文件时以UTF-8的格式读取  
  14. //      BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));  
  15.         BufferedReader br = new BufferedReader(new UnicodeReader(in, Charset.defaultCharset().name()));  
  16.           
  17.         String line = br.readLine();  
  18.         while(line != null)  
  19.         {  
  20.             System.out.println(line);  
  21.             line = br.readLine();  
  22.         }  
  23.     }  
  24. }  

 

第二篇文章:

Java读取utf-8文件注意有无BOM

原文地址:http://53873039oycg.iteye.com/blog/2030463

各位看标题就知道我要写什么了,先写结论,读取utf-8格式的文件时候,注意文件开头可能含有BOM标识符,结论写完了,下面的没必要看了,我记录下问题解决方法而已。

    

     虽然早知道utf-8文件可能含有bom标识符,我一直没碰到过,知道今天,我测试时候发现字符串长度不对劲,如下所示:

     

    长度不对劲,我就开始怀疑我碰上了传说中的BOM标识符了,下面可是验证,上代码:

    

 

Java代码  收藏代码
  1. public class UTFBOM文件处理 {  
  2.     public static void main(String[] args) throws Exception {  
  3.         List<String> resultList = readFileByLine("f:/saveFile/temp/name2.txt");  
  4.         String tmpStr = resultList.get(0);  
  5.         System.out.println(tmpStr + "----len=" + tmpStr.length());  
  6.         String tmpStr2 = new String(tmpStr.substring(01));  
  7.         System.out.println(tmpStr2 + "----hex=" + strtoHex(tmpStr2));  
  8.     }  
  9.   
  10.     public static String strtoHex(String s) {  
  11.         String str = "";  
  12.         for (int i = 0; i < s.length(); i++) {  
  13.             int ch = (int) s.charAt(i);  
  14.             String s4 = Integer.toHexString(ch);  
  15.             str = str + s4;  
  16.         }  
  17.         return "0x" + str;// 0x表示十六进制  
  18.     }  
  19.   
  20.     public static List<String> readFileByLine(String filename) throws Exception {  
  21.         List<String> nameList = new ArrayList<String>();  
  22.         File file = new File(filename);  
  23.         InputStreamReader isr = new InputStreamReader(  
  24.                 new FileInputStream(file), "UTF-8");  
  25.         BufferedReader reader = new BufferedReader(isr);  
  26.         String tmp = reader.readLine();  
  27.         while (tmp != null && tmp.trim().length() > 0) {  
  28.             nameList.add(tmp);  
  29.             tmp = reader.readLine();  
  30.         }  
  31.         reader.close();  
  32.         return nameList;  
  33.     }  
  34. }  

 

    结果为:

 

   

 

Java代码  收藏代码
  1. 掬水月在手----len=6  
  2. ----hex=0xfeff  

 

    看到好熟悉的feff。

 

    使用16进制打开文件,可以看到BOM标识符了。

 

    

    BOM是什么,可以
参考链接:

 

    http://mindprod.com/jgloss/bom.html

 

    ef bb bf

 

 

写道
UTF-8 endian, strictly speaking does not apply, though it uses big-endian most-significant-bytes first representation.

   

    解决方法:

    http://koti.mbnet.fi/akini/java/unicodereader/

   

Java代码  收藏代码
  1. public static List<String> readFileByLineWithOutBom(String filename)  
  2.             throws Exception {  
  3.         List<String> nameList = new ArrayList<String>();  
  4.         File file = new File(filename);  
  5.         InputStream in = new FileInputStream(file);  
  6.         BufferedReader reader = new BufferedReader(new UnicodeReader(in,  
  7.                 "utf-8"));  
  8.         String tmp = reader.readLine();  
  9.         while (tmp != null && tmp.trim().length() > 0) {  
  10.             nameList.add(tmp);  
  11.             tmp = reader.readLine();  
  12.         }  
  13.         reader.close();  
  14.         return nameList;  
  15.     }  

     带BOM标识符的文件怎么产生的呢?

     系统默认另存为utf-8保存的就是带bom的,以前一直用nodepad++另存为的,今天犯二了,忘了。

     

    全文完。

分享到:
评论

相关推荐

    Java避免UTF-8的csv文件打开中文出现乱码的方法

    Java避免UTF-8的csv文件打开中文出现...Java避免UTF-8的csv文件打开中文出现乱码的方法是使用UTF-16LE编码格式,并在文件头部输出BOM。同时,需要考虑Excel版本的兼容性问题,以确保csv文件可以正确地被打开和读取。

    Java解决UTF-8的BOM问题

    下面是一个简单的代码示例,展示了如何使用`UnicodeInputStream`和`UnicodeReader`来读取带有BOM的UTF-8文件: ```java import java.io.FileInputStream; import java.io.InputStreamReader; import java.io....

    java 读取服务器上的某个文件,并解决UTF-8 BOM文件的问号问题

    这个场景中,我们面临的挑战是如何正确处理UTF-8带有BOM(Byte Order Mark)的文件,因为BOM可能会导致文件内容显示为问号或者其他乱码。下面将详细介绍如何解决这个问题。 首先,我们需要理解什么是UTF-8的BOM。...

    批量去掉UTF-8文件中BOM标示符

    然而,UTF-8编码有一种特殊的形式,即带有BOM(Byte Order Mark)的UTF-8,也被称为UTF-8 with BOM。BOM是一个特殊的字符序列,用于标识文件的编码方式,但在某些情况下,BOM可能会引起问题,例如在某些编程语言中...

    批量utf文件转utf8-bom

    "批量utf文件转utf8-bom"这个主题指的是将一批以UTF编码的文件转换为带有BOM(Byte Order Mark)的UTF-8编码。BOM是一个特殊的字节序列,用于标识文件的编码类型,对于UTF-8编码,BOM的字节序列为0xEF, 0xBB, 0xBF。...

    PB9转换utf-8例子

    标题中的“PB9转换utf-8例子”指的是在PowerBuilder 9(PB9)环境下将数据从非UTF-8编码转换为UTF-8编码的一种解决方案。由于PB9本身不直接支持这种转换,开发者通常需要利用外部库或者特定的编程技巧来实现这个功能...

    MFC读取utf8示例

    以下是一个简单的MFC程序,演示了如何读取UTF-8编码的TXT文件: ```cpp #include #include // 自定义函数,用于读取UTF-8文件 void ReadUTF8File(const char* filePath) { std::ifstream file(filePath, std::...

    VB.NET读取文本(解决乱码)

    在VB.NET编程中,处理文本文件是常见的任务之一,但有时候由于编码问题,读取的文本可能会出现乱码。这通常发生在文件的编码格式与程序读取时所使用的编码不一致的情况下。本教程将深入探讨如何在VB.NET中正确地读取...

    php检测文件夹下有含BOM的UTF-8的文件

    然而,UTF-8的BOM并不是必需的,因为UTF-8是无字节顺序的,BOM的存在有时反而会引起问题,比如在某些编辑器中显示乱码或者在处理文件时出现错误。 标题提到的问题是关于如何使用PHP来检测一个文件夹中所有UTF-8格式...

    判断文本文件是否为UTF-8编码

    1. **检查BOM(Byte Order Mark)**:UTF-8允许在文件开头放置一个可选的字节顺序标记(BOM),其字节序为EF BB BF。如果文件以这三个字节开头,那么可以初步判断为UTF-8编码。但没有BOM的UTF-8文件也是存在的,所以...

    bat脚本将csv格式UTF-8批量转ANSI

    这是因为Excel默认可能不支持或识别UTF-8编码,尤其是不带BOM(Byte Order Mark)的UTF-8文件。解决这个问题的方法是将这些文件转换为Excel更友好的ANSI编码。 在提供的文件列表中,有两个批处理脚本文件: 1. `run...

    易语言另类数据库读写UTF-8

    在处理数据库时,数据的编码格式是非常重要的,UTF-8是一种广泛使用的Unicode编码,能支持多种语言字符集,包括中文。在易语言中实现另类数据库读写UTF-8,主要是为了克服原生支持的不足,提供更灵活和高效的数据...

    utf-8码转换器(转换成utf-8码)

    如果一个GBK编码的文本包含非GBK字符,使用UTF-8编码器读取会出现乱码。因此,通过转换器将GBK编码转换为UTF-8编码,可以确保文本在各种系统和语言环境中都能正确显示。 4. **编码转换工具的实现**: - 接收输入:...

    Java判断文件编码格式 - 明明是悟空 - 博客园1

    本文将探讨如何使用Java进行文件编码格式的识别,主要介绍两种方法:一种是简单的UTF-8判断,另一种是使用开源库cpdetector。 首先,对于简单的UTF-8编码格式判断,我们可以直接读取文件的前三个字节来确定。UTF-8...

    php utf-8编码去bom小工具

    BOM是UTF-8编码的一个可选特征,它在文件开头放置三个特殊的字节来标识文件的字符编码,但这可能会导致在某些编辑器或浏览器中出现不必要的字符或者乱码问题。因此,开发这个小工具是为了帮助开发者处理这个问题。 ...

    java读写csv文件,中文乱码问题

    4. **处理BOM头**:UTF-8有带BOM和不带BOM两种形式,如果文件开头带有BOM标记,可能需要在读取时进行特殊处理,因为某些库可能不支持带BOM的UTF-8。 5. **使用第三方库**:有一些Java库,如OpenCSV、Apache Commons...

    如何使用Java代码将GBK编码格式的工程转换为UTF-8编码格式的工程.zip

    5. **处理源代码**:如果工程包含Java源代码,需要确保IDE的编码设置也是UTF-8,避免编译时出现乱码问题。MyEclipse中可以在“Window” -&gt; “Preferences” -&gt; “General” -&gt; “Workspace”中设置默认文本文件编码...

    zh-cn-utf8

    1. **PHP文件编码**:确保所有PHP源代码文件使用UTF-8无BOM格式保存。BOM(Byte Order Mark)可能会导致在某些情况下出现问题。 2. **HTTP头部**:在PHP脚本中通过`header()`函数设置响应头的`Content-Type`为`text...

    如何将文本转换为UTF-8码 .e.rar

    - **Python**:使用`codecs`模块,如`codecs.open('原文件.txt', 'r', 'GBK').read()`读取GBK文件,再用`codecs.open('新文件.txt', 'w', 'utf-8')`写入UTF-8。 - **Java**:使用`java.nio.charset.Charset`类,如...

Global site tag (gtag.js) - Google Analytics