热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

java转换字符串编码格式的方法

这篇文章主要介绍了java转换字符串编码格式的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

java转换字符串编码格式 (解码错误,重新解码)

字符集概念:规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。

我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流。 

乱码场景(纯属瞎掰):

1) 前台输入utf-8编码的一串汉字(string1)。 (页面编码为utf-8, 在内存中会将这串汉字以utf-8编码为对应的二进制流存储)

2) 这串汉字(string1)的二进制流在经过http协议传输到后台时,这段比特流会被以iso-8859-1编码强行解码为字符串(string2)。

(2.1 http默认编码格式为iso-8859-1)

(2.2 这个默认编码在什么时候起作用呢? 应该是在到达tomcat之后, 到达servlet之前, tomcat对request请求强行使用iso-8859-1进行了解码)

(2.3 有什么办法阻止tomcat对request请求强行iso-8859-1解码呢?

apache-tomcat\conf\server.xml中添加URIEncoding="UTF-8"配置即可,还是来个图吧)

 

3) 在后台(servlet)接收字符串(string2)时毫无疑问的乱码了。

) 这时需要将接收到的字符串(string2)根据iso-8859-1编码重新转换为byte流。再将byte流根据utf-8编码重新解码为字符串(sting3)。

5) 这时的字符串(string3)和前台的字符串(string1)是对应同一个二进制流,并且使用的是同一种编码。也就不会乱码了。

乱码的另一种解决办法:

request.setCharacterEncoding("UTF-8"),这句话熟悉么,这句话的意思是:用"utf-8"编码对客户端的请求进行重新解码。

在步骤2之后(或步骤3中)执行,那么接收到的参数也不会乱码啦。 

一个小例子:

import java.io.UnsupportedEncodingException;

public class ConvertEncodingFormat {

  /**
   * 将一段错误解码的字符串重新解码
   */
  public static String convertEncodingFormat(String str, String formatFrom, String FormatTo) {
    String result = null;
    if (!(str == null || str.length() == 0)) {
      try {
        result = new String(str.getBytes(formatFrom), FormatTo);
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
    }
    return result;
  }

  /**
   * test
   */
  public static void main(String[] args) {
     // utf-8编码
    String str = "你好,少年!";

    // UTF-8编码的byte流强行用iso-8859-1解码,毫无疑问的乱码了
    String str1 = convertEncodingFormat(str, "UTF-8", "iso-8859-1");
    System.out.println(str1);

    // 将str1再转化为byte流,重新用UTF-8解码,乱码问题解决
    String str2 = convertEncodingFormat(str1, "iso-8859-1", "UTF-8");
    System.out.println(str2);
  }

}

java字符串的各种编码转换

import java.io.UnsupportedEncodingException; 
 
/** 
 * 转换字符串的编码 
 */ 
public class ChangeCharset { 
 /** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */ 
 public static final String US_ASCII = "US-ASCII"; 
 
 /** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */ 
 public static final String ISO_8859_1 = "ISO-8859-1"; 
 
 /** 8 位 UCS 转换格式 */ 
 public static final String UTF_8 = "UTF-8"; 
 
 /** 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 */ 
 public static final String UTF_16BE = "UTF-16BE"; 
 
 /** 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 */ 
 public static final String UTF_16LE = "UTF-16LE"; 
 
 /** 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 */ 
 public static final String UTF_16 = "UTF-16"; 
 
 /** 中文超大字符集 */ 
 public static final String GBK = "GBK"; 
 
 /** 
 * 将字符编码转换成US-ASCII码 
 */ 
 public String toASCII(String str) throws UnsupportedEncodingException{ 
 return this.changeCharset(str, US_ASCII); 
 } 
 /** 
 * 将字符编码转换成ISO-8859-1码 
 */ 
 public String toISO_8859_1(String str) throws UnsupportedEncodingException{ 
 return this.changeCharset(str, ISO_8859_1); 
 } 
 /** 
 * 将字符编码转换成UTF-8码 
 */ 
 public String toUTF_8(String str) throws UnsupportedEncodingException{ 
 return this.changeCharset(str, UTF_8); 
 } 
 /** 
 * 将字符编码转换成UTF-16BE码 
 */ 
 public String toUTF_16BE(String str) throws UnsupportedEncodingException{ 
 return this.changeCharset(str, UTF_16BE); 
 } 
 /** 
 * 将字符编码转换成UTF-16LE码 
 */ 
 public String toUTF_16LE(String str) throws UnsupportedEncodingException{ 
 return this.changeCharset(str, UTF_16LE); 
 } 
 /** 
 * 将字符编码转换成UTF-16码 
 */ 
 public String toUTF_16(String str) throws UnsupportedEncodingException{ 
 return this.changeCharset(str, UTF_16); 
 } 
 /** 
 * 将字符编码转换成GBK码 
 */ 
 public String toGBK(String str) throws UnsupportedEncodingException{ 
 return this.changeCharset(str, GBK); 
 } 
  
 /** 
 * 字符串编码转换的实现方法 
 * @param str 待转换编码的字符串 
 * @param newCharset 目标编码 
 * @return 
 * @throws UnsupportedEncodingException 
 */ 
 public String changeCharset(String str, String newCharset) 
  throws UnsupportedEncodingException { 
 if (str != null) { 
  //用默认字符编码解码字符串。 
  byte[] bs = str.getBytes(); 
  //用新的字符编码生成字符串 
  return new String(bs, newCharset); 
 } 
 return null; 
 } 
 /** 
 * 字符串编码转换的实现方法 
 * @param str 待转换编码的字符串 
 * @param oldCharset 原编码 
 * @param newCharset 目标编码 
 * @return 
 * @throws UnsupportedEncodingException 
 */ 
 public String changeCharset(String str, String oldCharset, String newCharset) 
  throws UnsupportedEncodingException { 
 if (str != null) { 
  //用旧的字符编码解码字符串。解码可能会出现异常。 
  byte[] bs = str.getBytes(oldCharset); 
  //用新的字符编码生成字符串 
  return new String(bs, newCharset); 
 } 
 return null; 
 } 
 
 public static void main(String[] args) throws UnsupportedEncodingException { 
 ChangeCharset test = new ChangeCharset(); 
 String str = "This is a 中文的 String!"; 
 System.out.println("str: " + str); 
 String gbk = test.toGBK(str); 
 System.out.println("转换成GBK码: " + gbk); 
 System.out.println(); 
 String ascii = test.toASCII(str); 
 System.out.println("转换成US-ASCII码: " + ascii); 
 gbk = test.changeCharset(ascii,ChangeCharset.US_ASCII, ChangeCharset.GBK); 
 System.out.println("再把ASCII码的字符串转换成GBK码: " + gbk); 
 System.out.println(); 
 String iso88591 = test.toISO_8859_1(str); 
 System.out.println("转换成ISO-8859-1码: " + iso88591); 
 gbk = test.changeCharset(iso88591,ChangeCharset.ISO_8859_1, ChangeCharset.GBK); 
 System.out.println("再把ISO-8859-1码的字符串转换成GBK码: " + gbk); 
 System.out.println(); 
 String utf8 = test.toUTF_8(str); 
 System.out.println("转换成UTF-8码: " + utf8); 
 gbk = test.changeCharset(utf8,ChangeCharset.UTF_8, ChangeCharset.GBK); 
 System.out.println("再把UTF-8码的字符串转换成GBK码: " + gbk); 
 System.out.println(); 
 String utf16be = test.toUTF_16BE(str); 
 System.out.println("转换成UTF-16BE码:" + utf16be); 
 gbk = test.changeCharset(utf16be,ChangeCharset.UTF_16BE, ChangeCharset.GBK); 
 System.out.println("再把UTF-16BE码的字符串转换成GBK码: " + gbk); 
 System.out.println(); 
 String utf16le = test.toUTF_16LE(str); 
 System.out.println("转换成UTF-16LE码:" + utf16le); 
 gbk = test.changeCharset(utf16le,ChangeCharset.UTF_16LE, ChangeCharset.GBK); 
 System.out.println("再把UTF-16LE码的字符串转换成GBK码: " + gbk); 
 System.out.println(); 
 String utf16 = test.toUTF_16(str); 
 System.out.println("转换成UTF-16码:" + utf16); 
 gbk = test.changeCharset(utf16,ChangeCharset.UTF_16LE, ChangeCharset.GBK); 
 System.out.println("再把UTF-16码的字符串转换成GBK码: " + gbk); 
 String s = new String("中文".getBytes("UTF-8"),"UTF-8"); 
 System.out.println(s); 
 } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 标题: ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
author-avatar
jp85201
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有