热门标签 | 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); 
 } 
} 

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


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 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配置错误等有关。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
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社区 版权所有