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);
 }
} 

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

(0)

相关推荐

  • Java找不到或无法加载主类及编码错误问题的解决方案

    先给出具体代码(当前目录为:D:\pro): package org.test; public class TestJava{ public static void main(String args[]){ System.out.println("Hello World!!!"); System.out.println("你好,Java!!"); } } 1. cmd 窗口运行时出现"找不到或无法加载主类"问题: D:\pro>javac

  • java多媒体文件编码 处理工具类代码实例

    这篇文章主要介绍了java多媒体文件编码 处理工具类使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引入 <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-core</artifactId> <version>1.1.0</version> </dependency>

  • Java实现图片与Base64编码互转

    淘宝里面的html用base64转换图片,不知道为什么,不过看起来好像很美好,话不多说,直接上代码: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import sun.misc.BASE64Decoder; import sun.misc.BA

  • Java实现BASE64编码和解码的方法

    BASE64和其他相似的编码算法通常用于转换二进制数据为文本数据,其目的是为了简化存储或传输.更具体地说,BASE64算法主要用于转换二进制数据为ASCII字符串格式.Java语言提供了一个非常好的BASE64算法的实现,.本文将简要地讲述怎样使用BASE64以及它是怎样工作的. Base64的作用:主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输.由于一些二进制字符在传输协议中属于控制字符,不能直接传送需要转换一下就可以了. 第一种方式: 通过反射使用java 中不对外公开的

  • Java实现base64图片编码数据转换为本地图片的方法

    本文实例讲述了Java实现base64图片编码数据转换为本地图片的方法.分享给大家供大家参考,具体如下: 项目中用到的把base64图片数据转为本地图片的函数 /** * 替换html中的base64图片数据为实际图片 * @param html * @param fileRoot 本地路径 * @param serRoot 服务器路径 * @return */ public static String replaceBase64Image(String html,String fileRoot

  • 详解Java如何获取文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式.其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8.由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码

  • Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码

    首先是网上大神给的类 package com.duanlian.daimengmusic.utils; public final class Base64Util { private static final int BASELENGTH = 128; private static final int LOOKUPLENGTH = 64; private static final int TWENTYFOURBITGROUP = 24; private static final int EIGH

  • Java编码辅助工具Mapstruct用法详解

    前言 项目开发中,业务分层会涉及不同类型的Bean之间需要相互转换,如PO与DTO之间,PO与VO之间等.手动编码setter/getter各个对应属性,会显得臃肿繁琐.通过Mapstruct框架可简单方便地完成这一工作. 如何引入: IntelliJ IDEA中安装MapStruct Support插件:File -> Settings -> Plugins 搜索 MapStruct support 安装,同时File -> Settings -> Compiler ->

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

    java转换字符串编码格式 (解码错误,重新解码) 字符集概念:规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系. 我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流. 乱码场景(纯属瞎掰): 1) 前台输入utf-8编码的一串汉字(string1). (页面编码为utf-8, 在内存中会将这串汉字以utf-8编码为对应的二进制流存储) 2) 这串汉字(string1)的二进制流在经过http协议传输到后台时,这段

  • Java获取字符串编码格式实现思路

    Java——获取字符串编码格式 判断一个字符串的编码格式: public static String getEncoding(String str) { String encode = "GB2312"; try { if (isEncoding(str, encode)) { // 判断是不是GB2312 return encode; } } catch (Exception exception) { } encode = "ISO-8859-1"; try {

  • java判断字符串相等的方法

    java中的字符串比较竟然不能直接用"=="!!!!而要用equals(),返回true为两字符串相等,返回false为两字符串不相等,举个栗子: if (s1.equals(s2)) { System.out.println("s1与s2相等!!"); } else { System.out.println("s1与s2没啥关系!!"); } 1.字符串是对象类型,所以不能用简单的"=="判断 2.equals()比较的是对

  • Java实现字符串切割的方法详解

    今天给大家介绍一个小知识点,但是会非常的实用,就是平时我们写Java代码的时候,如果要对字符串进行切割,我们巧妙的运用一些技巧,可以把性能提升5~10倍.下面不说废话,直接来给大家上干货! 工作中常用的split()切割字符串效率高吗? 首先,我们用下面的一段代码,去拼接出来一个用逗号分隔的超长字符串,把从0开始一直到9999的每个数字都用逗号分隔,拼接成一个超长的字符串,以便于我们可以进行实验,代码如下所示: public class StringSplitTest { public stat

  • Java检查日期字符串是否合法的方法总结

    目录 WHY HOW 1.使用 DateFormat 检查 2.使用 LocalDate 检查 3.使用 DateTimeFormatter 检查 4.使用 Apache 出品的 commons-validator 检查 总结 WHY 后端接口在接收数据的时候,都需要进行检查.检查全部通过后,才能够执行业务逻辑.对于时间格式,我们一般需要检查这么几方面: 字符串格式是否正确,比如格式是不是yyyy-MM-dd 时间在合法范围内,比如我们需要限定在一个月内的时间 字符串可以解析为正常的时间,比如

  • Java 实现字符串SHA1加密方法

    目录 Java 字符串SHA1加密 导入类 定义函数 javaSHA1实现加密解密 封装一个方法用于加密 主函数测试 Java 字符串SHA1加密 导入类 import java.security.MessageDigest; 定义函数 private String toUserPwd(final String password) { try { if (password == null) { return null; } final MessageDigest messageDigest =

  • Java批量转换文件编码格式的实现方法及实例代码

    一.场景说明 不知道大家有没有遇到过之前项目是GBK,现在需要全部换成UTF-8的情况.反正我是遇到了. eclipse可以改变项目的编码格式,但是文件如果直接转换的话里面的中文就会全部乱码,需要先复制文件内容然后改变文件格式,再全选 粘贴(可能有其它更好的方法我不知道), 这样的话一个项目要全部一个一个文件改,想想都难受.作为一个程序猿,就写了个简单的方法让程序处理. 思路:方法很简单,遍历项目文件夹-筛选java扩展文件-把文件编码从GBK转换成UTF-8. 注意:编码格式一定不要弄错,建议

  • Java实现字符串转换成可执行代码的方法

    使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能: import java.util.Map; import org.apache.commons.jexl2.Expression; import org.apache.commons.jexl2.JexlContext; import org.apache.commons.jexl2.JexlEngine; import org.apache.commons.jexl2.MapContext; /**

  • java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例

    本文实例讲述了java实现将字符串中首字母转换成大写,其它全部转换成小写的方法.分享给大家供大家参考,具体如下: public class TestSubstring { public static void main(String[] args) { String s = getConvert("adsJKJ3K21AfaAD134F13241d134134s141faAAFDF"); System.out.println(s); } //将一个字符串中的首字母转换成大写,其它的全部

  • java实现字符串和日期类型相互转换的方法

    本文实例讲述了java实现字符串和日期类型相互转换的方法.分享给大家供大家参考,具体如下: Date inDate = new Date(); //获取当前日期 //建立一个一定格式的 SimpleDateFormat SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String date = f.format(inDate); //将Date转化为字符串 System.out.println(date

随机推荐