编码解码相关资料

本文概括:

本文概括:

一、常见的编码表

二、编码解码

三、Java中一些编解码的常见使用

1. 内存

2. I/O 操作

3. Java Web-JSP/Servlet 中的编码方式

4. 数据库(mysql)



一、常见的编码表

ASCII:美国标准信息交换表
ISO8859-1:拉丁码表,欧洲码表
GB2312:中国的中文编码表
GBK:中国的中文编码表升级
GB18030:GBK的取代版本
BIG5:通用于香港、台湾地区的繁体字编码方案
UTF-8:最多用3个子节表示一个字符
Unicode:国际标准码,融合了多种文字,所有的文字都用两个子节来表示,Java语言使用的就是该码表

二、编码解码

编码过程:把看得懂的变成看不懂的

解码过程:把看不懂的变成看得懂的 

  • 编码、解码
    • 编码是信息从一种形式转换为另一种形式的过程。不同字符对应的二进制数的规则。
    • 解码是编码的逆过程,它是将存储在计算机的二进制转换为可以看到的字符。
    • 乱码,本质是编码解码采用的格式不统一造成的。

三、Java中一些编解码的常见使用

1. 内存

    Char、String、byte。char是一个unicode字符,为16位的整数。byte是字节,字符串在网络传输或存储需要转换为byte数组。在从网络接收或从存储设备读取后需要将byte数组转换为String。String 可以看为char组成的数组。String和char为内存形式,byte是网络传输或存储的序列化形式。

String wo = "我";
char woC = wo.charAt(0);
String woHex = Integer.toHexString(woC);//6211
//java内存中
byte[] woUnicodeBytes = wo.getBytes("unicode");//or UTF-16,结果一样
String woUniCodeByteHex = DatatypeConverter.printHexBinary(woUnicodeBytes);//FEFF 6211
byte[] woUTF_8Bytes =wo.getBytes("UTF-8");
String woUTF_8BytesHex = DatatypeConverter.printHexBinary(woUTF_8Bytes);//我的GBK编码 E6 88 91

我们在开发中,总是免不了对字符串的getBytes()、new String的过程,过程中会出现各种乱码问题。但初级开发人员请注意:Java提供的getBytes、new String方法都是提供了包含编码格式参数的,开发人员如果不写,则会采用操作系统当前的编码格式,getBytes()与getBytes(Charset.defaultCharset())等价,开发与部署的操作系统编码解码格式不一,便会出现各种乱码问题;故而建议大家显式地传入编码格式参数来使用这些方法。如,

String inputData = new String(inputFromRequestBytes,"UTF-8");
//do sth;
String outputData = "我处理完了";
byte[] outputResponseBytes = outputData.getBytes("UTF-8");

补充:Java中,可以查看Charset类,JDK1.6支持162种字符集。可以通过Charset的avaiableCharsets拿到所有的java支持的字符集。

System.out.println(Charset.availableCharsets().size());//jdk 1.8 输出 169
Set<String> charSetNames = Charset.availableCharsets().keySet();

System.out.println(charSetNames.contains("UTF-8"));
System.out.println(charSetNames.contains("GBK"));   

中文出现乱码情形可参考这个:http://blog.csdn.net/lwj734114646/article/details/51312970

2. I/O 操作

Java I/O流
I/O操作比内存唯一需要多注意的是,文件本身的编码格式。在操作系统下,手工创建的文件,如果不指定便是系统默认的编码格式,故而为避免因操作系统不同而带来的中文乱码问题,最好在文件写入和读出的时候显式指定编码格式。
java读取本地文件

public static String readFile(String fileName) {
    String fileContent = "";
    try {
      File f = new File(fileName);
      if (f.isFile() && f.exists()) {
        InputStreamReader read = new InputStreamReader(
            new FileInputStream(f), "gbk");
        BufferedReader reader = new BufferedReader(read);
        String line;
        while ((line = reader.readLine()) != null) {
          fileContent += line+"\n";
        }
        read.close();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return fileContent;
  }

java写入本地文件

public static void writeFile(String fileName, String fileContent) {
    try {
      File f = new File(fileName);
      if (!f.exists()) {
        f.createNewFile();
      }
      OutputStreamWriter write = new OutputStreamWriter(
          new FileOutputStream(f), "gbk");
      BufferedWriter writer = new BufferedWriter(write);
      writer.write(fileContent);
      writer.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

3. Java Web-JSP/Servlet 中的编码方式

3.1 Jsp编译

<%@page pageEncoding=”GBK”%>,jsp编译成servlet源代码文件时所使用的编码,指定文件的存储编码,很明显,该设置应该置于文件的开头。
3.2 Jsp输出

<%@ page contentType=”text/html; charset= GBK” %>,指定文件输出到browser时使用的编码,该设置也应该置于文件的开头。该设置和response.setCharacterEncoding(“GBK”)等效,即服务器响应(response)的编码方式。
3.3 Meta 设置

< META http-equiv=”Content-Type” content=”text/html; charset=GBK” />
指定网页使用的编码,该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置,而且也无法执行response.setCharacterEncoding()。例如:
如果同时采用了jsp输出和meta设置两种编码指定方式,则jsp指定的优先。因为jsp指定的直接体现在response中。
需要注意的是,apache有一个设置可以给无编码指定的网页指定编码,该指定等同于jsp的编码指定方式,所以会覆盖静态网页中的meta指定。所以有人建议关闭该设置。
3.4 Form 设置

,当浏览器提交表单的时候,可以指定相应的编码。一般不必不使用该设置,浏览器会直接使用网页的编码。
3.5 servlet 中的设置

setCharacterEncoding(),该函数用来设置http请求或者相应的编码。
a)请求:request.setCharacterEncoding(“GBK”),设置对客户端请求数据的编码的方式,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理(如:iso8859_1解码,GBK编码)。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。
b)响应:response.setCharacterEncoding(“GBK”),其作用是指定服务器响应的编码方式,服务器在将数据发送到浏览器之前,对数据进行重新编码时使用的编码方式,同时,该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。

4. 数据库(mysql)

很明显,要支持多语言,应该将数据库的编码设置成utf或者unicode,而utf更适合与存储。但是,如果中文数据中包含的英文字母很少,其实unicode更为适合。

数据库的编码可以通过mysql的配置文件设置,例如default-character-set=utf8。还可以在数据库链接URL中设置,例如: useUnicode=true&characterEncoding=UTF-8。注意这两者应该保持一致,在新的sql版本里,在数据库链接URL里可以不进行设置,但也不能是错误的设置。

参考文章一见:https://blog.csdn.net/proteen/article/details/79187831

参考文章二见:https://www.cnblogs.com/x_wukong/p/3675832.html

参考文章三见:https://blog.csdn.net/heyanxi0101/article/details/80356870

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值