`

读取unicode编码文件的乱码解决

 
阅读更多

首先,有必要了解下记事本文件的几种编码方式:

 


 

四种常见文本文件编码方式研究

ANSI、UNICODE 、UNICODE big endian、UTF-8四种格式编码存在差别,简要介绍如下:

ANSI编码:

无文件头(文件编码开头标志性字节)    

ANSI编码字母数字占一个字节,汉字占两个字节,

回车换行符 单字节   十六进制表示为0d  0a

 

UNICODE编码:

文件头,十六进制表示为FF FE

每一个字符都用两个字节编码

回车换行符  双字节   000d  000a

 

Unicode big endian编码:

文件头十六进制表示为FE FF ,

后面编码是把字符的高位放在前面,低位放在后面,正好和Unicode编码颠倒。

回车换行符,双字节,十六进制表示为0d00  0a00

 

UTF-8 编码:

文件头,十六进制表示为EF BB BF。

UTF-8是Unicode的一种变长字符编码,数字、字母、回车、换行都用一个字节表示,汉字占3个字节.

回车换行符,单字节,十六进制表示为0d 0a

 

以中文"你好"二字为例,各种类型的编码对应的十六进制格式(可由EditPlus查看)如下图所示:


 

一个汉字在Unicode中用两个字节表示,a-z等字母也是两个字节。

UTF-8是Unicode的一种表现形式(Unicode编码值使用UTF-8方式编码存储),是一种变长的表达方式,把字符的Unicode编码在文件中表现出来,从一个字节到三个字节不等(为了减少如a-z等ascii码字符占用的空间,因为他们出现太频繁了).

UTF-8编码范围为:

0000 - 007F : 0xxxxxxx

0080 - 07FF : 110xxxxx 10xxxxxx

0800 - FFFF : 1110xxxx 10xxxxxx 10xxxxxx

如"汉"的Unicode编码为6C49,在0800 - FFFF之间,所以要使用3字节模板: 1110xxxx 10xxxxxx 10xxxxxx

6C49的二进制是: 0110 110001 001001

用这个二进制流依次代替3字节模板中的x得: 1110 0110 10110001 10001001,即E6 B1 89

保存到文件中的就是3个字节E6 B1 89,而不是2个字节6C 49

 

// 给InputStreamReader指定要读取的文件的编码,读取时就不会出现乱码了.
public class TextFileReader {
    public static void main(String[] args) throws Exception {
        String filename = "source/demo.txt";
        String encoding = "Unicodelittle";
        printFile(filename, encoding);
    }

    // 打印出文件的文本内容, 使用指定的编码读入文件
    public static void printFile(String filename, String encoding) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream(filename), encoding);
        BufferedReader reader = new BufferedReader(isr);
        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    }
}

 

文本编码方式是unicode,在读取文件流时需要指定encoding为unicodelittle。

文本编码方式是unicode big endian, 在读取文件时指定encoding为unicode。

 

在写文件时,当encoding指定为unicode时,生成的文本文件的编码格式为unicode big endian,故需指定为unicodelittle。

 

若为ANSI 编码,在文件流操作时,不需要指定编码方式,使用默认即可。 

 

参考文献:

http://www.cppblog.com/biao/archive/2012/10/19/137637.html

http://blog.csdn.net/soleghost/article/details/959832

http://bbs.csdn.net/topics/330045908

http://www.chengxuyuans.com/code/C++/63390.html

  • 大小: 18.3 KB
  • 大小: 52.6 KB
分享到:
评论

相关推荐

    Java读取TXT文本文件乱码解决方案.doc

    本文提供了 Java 读取 TXT 文本文件乱码解决方案,并讨论了 TXT 文件的编码格式和获取编码格式的方法。 知识点: * Java 读取 TXT 文本文件时可能出现乱码的问题 *乱码的问题是由于文件的编码格式引起的 * 使用 ...

    Android读取中文文件乱码解决方法

    ### Android读取中文文件乱码解决方法 #### 一、问题背景 在开发Android应用时,经常需要处理中文字符或包含中文的文件。如果处理不当,可能会遇到中文乱码的问题,尤其是在读取本地文件或者从网络下载文件时更为...

    Java读取TXT文本文件乱码解决方案.pdf

    总之,Java 读取 TXT 文件乱码的解决方案在于确定文件的正确编码,并在读取时指定该编码。通过使用 `InputStreamReader` 并传递正确的编码字符串,可以有效地解决这类问题。同时,了解各种编码格式的特点以及如何...

    VB读取记事本无乱码txt

    `StreamReader`支持多种编码,包括Unicode(如UTF-8),这样我们就能处理各种编码的文本文件,避免乱码。 以下是一个简单的VB代码示例,展示了如何读取记事本文件内容并赋值给string变量: ```vb Imports System....

    Java读取TXT文本文件乱码解决方案.docx

    Java 读取 TXT 文本文件时遇到乱码问题通常是由于编码格式不匹配导致的。在 Java 中,当读取文本文件时,默认使用的是平台的默认编码,这在处理非 ASCII 字符时可能会出现问题,尤其是当文件采用不同编码(如 UTF-16...

    C#的ini文件操作,解决网上未解决的Get或Set中文乱码问题

    而网上另外也有资料如何处理中文编码,例如转码为utf-8,存能解决乱码,取又出现问题。本资源我重新整理,用unicode完美解决中文乱码问题。用法: 1.声明实例 IniFile iniFile = new IniFile(HttpContext....

    解决android读取中文乱码 自动判断文档类型并转码

    Android 读取中文 txt 文件时经常会出现乱码问题,主要是因为文档的编码格式不确定,从而导致读取时出现乱码。为了解决这个问题,我们可以通过自动判断文档类型并转码来解决乱码问题。 在 Java 中,我们可以使用 ...

    java 读取文件乱码

    博文链接中的资源`UnicodeReader.java`和`UnicodeInputStream.java`可能提供了自定义的类来处理非ASCII字符集的文件,尤其是针对Unicode编码的文件。`UnicodeReader`可能是一个扩展了`BufferedReader`的类,它允许...

    java解析文件乱码解决

    3. **处理BOM头**:某些Unicode编码(如UTF-8、UTF-16)可能包含字节顺序标记(BOM),在读取前需要检测并去除BOM,以防止解析错误。 4. **使用第三方库**:如果Java标准库无法满足需求,可以考虑使用开源库,如...

    解决读写包含汉字的txt文件时乱码的问题

    当程序读取或写入文件时,如果使用的编码与文件实际编码不符,就会出现乱码。 在Windows系统下,默认的编码格式为GB2312(对于早期版本)或GBK(对于较新版本),而C#中默认的文件读写流(StreamReader/StreamWriter...

    关于GBK和Unicode字符集转换乱码问题

    - **编码不一致**:如果一个程序或系统默认使用GBK编码,而输入的数据却是Unicode编码,那么在没有进行正确的编码转换的情况下,显示出来的就会是乱码。 - **转换错误**:在实际操作中,如果没有正确设置转换规则...

    C#读取中文文件出现乱码的解决方法

    以下是一些解决C#读取中文文件出现乱码的方法: 首先,了解文件的编码格式至关重要。常见的中文编码有GBK(GB2312)和UTF-8。在C#中,`StreamReader` 是用于读取文本文件的主要类,它接受一个编码参数来指定文件的...

    MFC UTF-8文件批量转成GB2312 解决中文乱码问题

    在本场景中,我们面对的问题是“MFC UTF-8文件批量转成GB2312 解决中文乱码问题”,这涉及到文件的读取、编码转换以及文件的写入操作。 首先,我们需要理解UTF-8和GB2312这两种编码的区别。UTF-8是一种变长的...

    flex读取xml乱码的解决方法

    默认情况下,Flex使用Unicode编码(通常是UTF-8或UTF-16)来处理字符串,但如果XML文件使用的是其他编码,如GBK、BIG5等,那么在没有正确指定编码的情况下,Flex将无法正确解析XML中的字符,导致乱码出现。...

    Python之pandas读写文件乱码的解决方法

    python读写文件有时候会出现  ‘XXX’编码不能打开XXX什么的,用记事本打开...以上这篇Python之pandas读写文件乱码的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。

    unicode文件的压缩包

    UTF-8是最常见的Unicode编码方式,它使用1至4个字节来表示一个码点。对于ASCII字符(英语字符集),UTF-8编码与ASCII编码相同,这使得UTF-8与许多现有的ASCII系统兼容。在“1.TXT”、“3.TXT”和“2.TXT”这些文件中...

    Delphi读写UTF-8、Unicode格式文本文件 .mht

    Delphi读写UTF-8、Unicode格式文本文件 .mht

    VC6.0++乱码解决

    - **使用Unicode编码**:在项目设置中,可以将项目的源代码编码改为Unicode(UTF-16或UTF-8),这样可以直接在源代码中使用各种语言的字符,无需担心编码冲突。 - **更新或替换字体**:如果发现某些字体在显示中文...

Global site tag (gtag.js) - Google Analytics