`

读取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
分享到:
评论

相关推荐

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

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

    java web 开发 unicode 乱码解决方案

    常用java转码方法,以及绕过web服务器二次编码技术。

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

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

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

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

    txt文件编码批量转换器 V2.1版

    通常我们电脑里的txt文件都是ASNI编码,放到手机,MP3等设备里面,打开看到的都是乱码。所以我们必须先把它们转换为Unicode格式,才能够在手机和MP3上面打开。如果有大量的文件,一个一个打开另存为Unicode,那是很...

    大文本读取,使用API,可转换UTF-8,Unicode编码

    大文本读取,使用API,可转换UTF-8,Unicode编码 稍作修改,可以做成一个DLL文件,以备asp调用,速度超快

    C# 读取文本文件 字符编码.rar

    在读取文本文件的内容时,如果里面有中文,常常出现乱码问题。一般原因主要是文本文件的编码设置 不是Unicode/Unicode-8格式,所以读出的是乱码。解决办法之一是在读取的时候用System.Text.Encod ing.GetEncoding("gb...

    VBnet操作文本文件的问题

    .net里面的StreamReader读取文本文件默认使用utf-8的编码,因此,如果你写一个最简单的使用StreamReader.ReadToEnd的方法读出一个文本文件放入文本框中,八成出现的是乱码。因为在中文系统上,纯文本文件默认的保存...

    php 读取文件乱码问题

    网上的解决办法说抓取后用iconv()转码。...都 提到了“默认是UTF-8,但是用户可以用stream_default_encoding()或者用户自定义上下文属性改变编码”(If unicode semantics are enabled, the default

    Linux系统下Mp3标签乱码问题的分析和解决

    它不论mp3是采取何种的标准的标签,只要mp3的标签的内容是Unicode编码存储的,那么显示肯定是正常的。如果遇到是以gbk、gb18030、big5等编码的中文内容时,它还是会把它当成ISO-8859-1来读取,乱码就成了必然。说了...

    eclipse文件编码设置、转换原理与实用工具

    汉字转unicode编码(unicode编码如\u5546),在编码为iso-8839-1的文件中显示汉字必须转为unicode编码才行。 3.文件编码的自动设别方法与测试示例(自动列出编码、最可能的编码、有多种编码可能的情况下打印用各种...

    解析StreamReader与文件乱码问题的解决方法

    相信很多人在读取文件的时候都会碰到乱码的情况,所谓乱码就是错乱的编码的意思,造成乱码的是由于编码不一致导致的。 演示程序: 新建3个文本文件: 编码和名字一样,分别是ansi,Unicode,utf8 里面的内容都是: ~...

    Ruby 与编码

    Ruby 与编码 常见问题 * 乱码的问题 * Ruby 中 Unable to convert "\x89" from ASCII-8BIT to UTF8 *Incompatible character encodings: ASCII- 8BIT and UTF-8

    python避免中文乱码的代码.docx

    python避免中文乱码的代码全文共4页,当前为第1页。python避免中文乱码的代码全文共4页,当前为第1页。...普通字符串使用ASCII码表示,而Unicode字符串python避免中文乱码的代码全文共4页,当前为第2页。python避免中文

    txt文件编码批量转换器V2.11版

    通常我们电脑里的txt文件都是ASNI编码,放到手机,MP3等设备里面,打开看到的都是乱码。所以我们必须先把它们转换为Unicode格式,才能够在手机和MP3上面打开。如果有大量的文件,一个一个打开另存为Unicode,那是很...

    Python 编码处理-str与Unicode的区别

    一篇关于STR和UNICODE的好文章 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 用python处理中文时,读取文件或消息,http参数等等 一运行,发现乱码(字符串处理,读写文件,print) ...

    Read Unicode Text in LabVIEW.zip

    在默认情况下,LabVIEW的文本文件只支持ASCI的编码存取。对中文而言则取决于系统默认,如果是简体中文则为GB2312编码,繁体中文则为Big5编码。本vi可以使你在LabVIEW中读取unicode编码的文本,不乱码。

    Python字符串的encode与decode研究心得乱码问题解决方法

    字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。  decode的作用是将...

    EncodingDetect.java自动获取文件的编码.rar

    EncodingDetect.java,java自动获取文件的编码,智能识别文件编码,支持本地file及指定url的编码识别,支持多达40余种编码的识别,包括最常见的UTF-8,GBK,GB2312,BIG5,UNICODE,ISO8859_1,ASCII等,FileUtil....

    Flask 让jsonify返回的json串支持中文显示的方法

    用flask时遇到了返回字符串支持中文显示的问题,在web端显示的是utf-8的编码,而不是中文,如下图。 虽然不影响接口的读取,但是可读性太差,于是研究了一下怎么直接显示成中文。最后找到了解决方案如下,在配置中...

Global site tag (gtag.js) - Google Analytics