`

UTF8和GBK区别,以及读取文件存在BOM,第一个字符值为65279

 
阅读更多

一、GBK的文字编码:是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。

UTF-8编码:则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的网站则用UTF-8节省空间。

所以如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。 所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

ISO-8859-1:中文只占一个字节

 

二、首先了解一下BOM,字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。【来自维基百科

 

读取文件代码,代码底层读取文件时,会根据不同编码的CharsetDecoder实现类来读取(比如UTF8编码):

 public static void main(String[] args) throws FileNotFoundException {
		FileReader reader = new FileReader(new File("data.txt"));
		int read;
		try {
			System.out.println(reader.getEncoding());
			while((read = reader.read())!=-1){
				System.out.println(read+":"+(char)(read));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 

新建文本,内容为:

1411111哈哈

 1、当格式为以UTF8有BOM时:

输入结果:

UTF8
65279:
49:1
52:4
49:1
49:1
49:1
49:1
49:1
21704:哈
21704:哈

 

2、当格式为以UTF8无BOM时:

输入结果:

UTF8
49:1
52:4
49:1
49:1
49:1
49:1
49:1
21704:哈
21704:哈

 

注意:上面代码中,我们直接用char强转读取的int值,并不是因为不考虑ASCII码表,而是因为read()方法底层读取的是char字段,直接赋值给int返回的。

int read;
System.out.println(reader.getEncoding());
while((read = reader.read())!=-1){
	System.out.println(read+":"+(char)(read));
}
 read()方法,arg1[0]为char类型:
private int read0() throws IOException {
      Object arg0 = this.lock;
      synchronized(this.lock) {
         if(this.haveLeftoverChar) {
            this.haveLeftoverChar = false;
            return this.leftoverChar;
         } else {
            char[] arg1 = new char[2];
            int arg2 = this.read(arg1, 0, 2);
            switch(arg2) {
            case -1:
               return -1;
            case 0:
            default:
               assert false : arg2;

               return -1;
            case 2:
               this.leftoverChar = arg1[1];
               this.haveLeftoverChar = true;
            case 1:
               return arg1[0];
            }
         }
      }
   }
 三、一个ASCⅡ占用一个字节,所以假如在操作二进制流,比如发送http请求组装参数时,你把内容放入ByteArrayOutputStream,这时候你需要输入"xxxx?myname=liu刘",则操作如下示例:
os.write(URLEncoder.encode("xxxx", requestEncoding).getBytes());
os.write(63);//ASCⅡ代表?
os.write(URLEncoder.encode("myname", requestEncoding).getBytes());
os.write(61);//ASCⅡ代表=
os.write(URLEncoder.encode("liu刘", requestEncoding).getBytes());
其中用的URLEncoder编解码目的是因为http的get请求不支持中文,所以先编码一下,接受后解码可以预防乱码问题,英文编码前后不变化。示例:
		String content = "abc123ha刘";
		String encoderString = URLEncoder.encode(content, "utf-8");
		System.out.println(encoderString);
		String decodedString = URLDecoder.decode(encoderString, "utf-8");
		System.out.println(decodedString);
 输出:
abc123ha%E5%88%98
abc123ha刘
 
四、
 
分享到:
评论

相关推荐

    windows下利用libiconv将实现utf8和gbk编码之间转换

    此外,如果处理的文本包含非ASCII字符,还需要注意字节顺序标记(BOM)的影响,因为UTF-8和GBK都不包含BOM,但某些程序可能会添加BOM来标识文件编码。 总之,libiconv在Windows环境下的UTF-8和GBK编码转换是通过...

    gb2312,utf-8,utf-8-bom等编码格式的互相转换

    UTF-8-BOM,全称是“UTF-8 Byte Order Mark”,它在UTF-8编码的文件开头添加了一个特殊的字节序列(0xEF, 0xBB, 0xBF)来标识该文件使用的是UTF-8编码。BOM主要用于帮助软件识别文件的编码,但并非所有UTF-8编码的...

    C语言字符编码转换UNICODE、GBK、UTF-8互相转换

    UTF-8是一种变长的编码方式,它可以使用1到4个字节来表示一个字符。对于ASCII字符,UTF-8使用单个字节,而对于其他Unicode字符,它使用更多字节。这种编码方式使得在处理混合语言的数据时非常方便,因为它可以无缝地...

    Java源码编码转换器 GBK TO UTF8 UTF8 To GBK(无源码)

    Java源码编码转换器是一款实用工具,主要用于将Java源代码文件从GBK编码转换为UTF-8编码,或者从UTF-8编码转换为GBK编码。在软件开发过程中,尤其是在处理中文字符时,编码问题是一个常见的挑战。GBK是中文环境下...

    Ant编译utf-8非法字符:\\65279

    这个问题可能是因为源代码文件使用了UTF-8编码,而Ant默认使用的是GBK或者其他非UTF-8的编码格式,当Ant尝试读取或编译这些文件时,无法正确解析包含UTF-8 BOM(Byte Order Mark)的文件,BOM的Unicode值是\\65279...

    java获取文件编码(判断有无BOM)

    BOM是UTF-8、UTF-16和UTF-32等编码格式中的一个可选标记,用于告知解析器文件的编码类型。例如,UTF-8的BOM是三个字节(0xEF, 0xBB, 0xBF),而UTF-16LE和UTF-16BE的BOM分别是两个字节(0xFF, 0xFE)和(0xFE, 0xFF...

    sql,GBK2312,UTF-8,UTF-8 无BOM,脚本字符集转换,脚本格式转换

    "sql,GBK2312,UTF-8,UTF-8 无BOM,脚本字符集转换,脚本格式转换"这个主题核心是关于如何在不同字符编码之间转换SQL脚本,以确保数据的正确性和兼容性。以下是一些相关的知识点: 1. **字符编码**:字符编码是...

    gbk/utf8编码互转

    UTF-8编码的优势在于跨平台兼容性和网络传输效率,因为英文字符只用一个字节,所以在英文为主的文本中,文件体积相对较小。 在处理涉及不同编码的文件时,有时需要进行GBK和UTF-8之间的转换。例如,当你从一个GBK...

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

    但如果你不想读取BOM,可以创建一个无BOM的UTF-8编码对象: ```vb.net Dim encoding As Encoding = New UTF8Encoding(False) ``` 除了使用`StreamReader`,还可以使用`File.ReadAllText`或`File.ReadAllLines`方法...

    批量GBK转UTF8工具

    本文将详细讨论“批量GBK转UTF8工具”的相关知识点,包括GBK与UTF8编码的区别、转换工具的重要性和如何进行批量转换。 GBK编码,全称为“汉字内码扩展规范”,是中国大陆基于GB2312标准的扩展,它包含了更多的汉字...

    C++读取UTF8编码文件,乱码测试数据

    在编程领域,尤其是在使用C++这种语言时,处理不同编码格式的文本文件是一项常见的任务。在本场景中,我们关注的是如何在...正确地读取和转换UTF8或GBK编码的文件,需要理解字符编码原理,并可能利用额外的库来实现。

    freemaker生成静态文件时转换文件原编码GBK为UTF-8

    标题提到的"freemaker生成静态文件时转换文件原编码GBK为UTF-8",这涉及到的是在使用FreeMarker生成静态文件时,如何处理从GBK编码转换到UTF-8编码的问题。 GBK是GB2312编码的扩展,包含了更多的汉字,但在处理多...

    C编码转换:gbk转unicode utf8转unicode

    3. **UTF-8转Unicode**:UTF-8编码的字符可以是一个字节到四个字节的序列,解码时需要识别每个字符的字节长度,然后根据UTF-8的编码规则将这些字节转换为Unicode码点。UTF-8编码的优势在于其对ASCII字符的兼容性,...

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

    3. **转换编码**:对于检测到GBK编码的文件,使用`java.nio.file.Files`类的`readAllBytes`和`write`方法,配合`java.nio.charset.StandardCharsets`中的`UTF_8`常量,将文件内容从GBK编码转换为UTF-8编码。...

    深入UTF8字符编码

    - BOM(Byte Order Mark):UTF-8编码的文件可以带有一个可选的BOM标记,用于指示数据流的字节顺序,但某些工具或程序可能不支持带BOM的UTF-8。 - 乱码问题:检查文件读取和写入时的编码设置,确保一致。 - 汉字全角...

    Utf-8编码与解码(vb6代码)

    UTF-8的特点是每个Unicode字符可以被编码为1到4个字节,其中ASCII字符(基本的英文字符)仅需1个字节。这使得UTF-8在处理多种语言的文本时具有很好的效率,同时也兼容了大部分早期基于ASCII的系统。 在VB6(Visual ...

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

    1. **连接数据库**:使用易语言提供的数据库接口创建数据库连接,设置正确的字符集,例如在ODBC中设置“Character Set”参数为“utf8”。 2. **SQL语句准备**:在执行SQL语句前,确保所有字符串已经按照UTF-8编码。...

    易语言TXT快速转换UTF-8

    这个"易语言TXT快速转换UTF-8源码"项目,为学习易语言的初学者提供了一个很好的实践机会,让他们能够深入理解文件操作和编码转换的概念,同时也可作为日常工作中处理编码问题的一个实用工具。通过分析和运行这个源码...

    Python-convert2utf将目录下的全部源文件转成UTF8编码

    标题"Python-convert2utf将目录下的全部源文件转成UTF8编码"指的是使用Python编写的一个脚本或工具,该工具能够遍历指定目录,检测并转换其中的GB、GBK以及其他非UTF-8编码的文本文件和源代码文件,统一转换为UTF-8...

    C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)

    这个方法逐个检查字节,根据UTF8编码的规则,第一个字节的最高位必须为1,后续字节的最高两位必须是10,以此来确定字符的长度。如果不符合这些规则,则认为不是UTF8编码。 在实际应用中,这个类可以方便地集成到你...

Global site tag (gtag.js) - Google Analytics