iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java中的编码转换过程(以utf8和gbk为例)
  • 103
分享到

java中的编码转换过程(以utf8和gbk为例)

java中的编码java编码转换javautf8和gbk 2023-05-15 17:05:02 103人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录java中的编码转换(以utf8和gbk为例)以下是针对以上情况的代码测试java编码格式的转换以及乱码恢复如何在java中进行编码格式转换首先什么情况会乱码为什么gbk,gb2

java中的编码转换(以utf8和gbk为例)

在正常javaweb开发中经常会发现字符转换的需求,会存在中文字符转换乱码的现象,如何解决以及其转换原理我至今懵懵懂懂,于是专门写了个测试代码进行尝试,总算理清了编码,先上结论,总结如下:

utf8中存放有各种语言编码,当前主流开发中会使用utf8进行编码解码,该方式不会产生乱码,产生乱码有以下几种情况

  • 1、gbk(中文)、iso-8859-1(无中文)等其他方式进行编码,则只能用其对应方式进行解码,否则为乱码
  • 2、使用utf8进行编码用其他方式解码则会导致乱码,需进行一次转换
  • 3、使用无对应字符(中文)的字符集(iso-8859-1)编码会导致乱码,且无法还原解码

以下是针对以上情况的代码测试

1.如何编码就如何解码


@Test
public void test0() {
    String test = "测试";
    System.out.println(Arrays.toString(test.getBytes(StandardCharsets.UTF_8)));//[-26, -75, -117, -24, -81, -107]
    System.out.println(new String(test.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8));//测试
}

@Test
public void test1() throws UnsupportedEncodingException {
    String test = "测试";
    System.out.println(Arrays.toString(test.getBytes("gbk")));//[-78, -30, -54, -44]
    System.out.println(new String(test.getBytes("gbk"), "GBK"));//测试
}

utf8编码 - 错误形式解码


@Test
public void test2() throws UnsupportedEncodingException {
    String test = "测试";
    System.out.println(Arrays.toString(test.getBytes(StandardCharsets.UTF_8)));//[-26, -75, -117, -24, -81, -107]
    System.out.println(new String(test.getBytes(StandardCharsets.UTF_8), "gbk"));//娴嬭瘯
}

正确做法,按错误的解码形式(gbk)作为中转,将其按错误形式(gbk)重新还原编码(utf8-encode),再使用utf8进行一次正确解码(utf8-decode)即可得到原来的字符


@Test
public void test3() throws UnsupportedEncodingException {
    String test = "测试";
    String test_gbk_utf8 = new String(test.getBytes(StandardCharsets.UTF_8), "gbk");
    System.out.println(test_gbk_utf8);//娴嬭瘯
    String test_utf8_gbk = new String(test_gbk_utf8.getBytes("gbk"), StandardCharsets.UTF_8);
    System.out.println(test_utf8_gbk);//测试

}

3.无对应字符编码

@Test
    public void test4() throws UnsupportedEncodingException {
        String test = "测试";
        System.out.println(Arrays.toString(test.getBytes(StandardCharsets.ISO_8859_1)));//[63, 63]
        System.out.println(new String(test.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.ISO_8859_1));//??
    }

该情况下即使使用原先的编码方式进行解码也无法还原字符了,属于不可逆的状态

java编码格式的转换以及乱码恢复

如何在java中进行编码格式转换

下面这行代码的含义是: 获取目标字符串str的gbk编码格式的二进制码,然后将二进制码按照utf8编码格式重新编码成字符串,当然,下面这种写法百分百会乱码,因为编码格式不一致.

new String(str.getBytes("gbk"),"utf8")

首先什么情况会乱码

如果要传输一个字符串,首先要按照一定的编码格式将字符串转换成字节流,当字节流传输到接收方的时候再将字节流按照某种编码格式转换成字符串.乱码也正是产生在重新转换成字符串的过程中.以下是我对中文乱码的测试:

  String str="彩虹";
        String [] a=new String[] {"gbk","unicode","utf8","gb2312"};
        for (int i=0;i<a.length;i++){
            for (int j=0;j<a.length;j++){
                System.out.println("二进制格式:   "+a[i]+"编码格式:  "+a[j]);
                System.out.println("编码后的字符串:  "+new String(str.getBytes(a[i]),a[j]));
 
            }
        }

二进制格式:   gbk编码格式:  gbk
编码后的字符串:  彩虹
二进制格式:   gbk编码格式:  unicode
编码后的字符串:  닊뫧
二进制格式:   gbk编码格式:  utf8
编码后的字符串:  �ʺ�
二进制格式:   gbk编码格式:  gb2312
编码后的字符串:  彩虹
二进制格式:   unicode编码格式:  gbk
编码后的字符串:  �_i唝
二进制格式:   unicode编码格式:  unicode
编码后的字符串:  彩虹
二进制格式:   unicode编码格式:  utf8
编码后的字符串:  ��_i�y
二进制格式:   unicode编码格式:  gb2312
编码后的字符串:  ��_i�y
二进制格式:   utf8编码格式:  gbk
编码后的字符串:  褰╄櫣
二进制格式:   utf8编码格式:  unicode
编码后的字符串:  ꧨ馹
二进制格式:   utf8编码格式:  utf8
编码后的字符串:  彩虹
二进制格式:   utf8编码格式:  gb2312
编码后的字符串:  褰╄��
二进制格式:   gb2312编码格式:  gbk
编码后的字符串:  彩虹
二进制格式:   gb2312编码格式:  unicode
编码后的字符串:  닊뫧
二进制格式:   gb2312编码格式:  utf8
编码后的字符串:  �ʺ�
二进制格式:   gb2312编码格式:  gb2312
编码后的字符串:  彩虹

可以看出,如果二进制编码格式和字符串的编码格式不同就会引起乱码.

为什么gbk,gb2312转换没有乱码?

gbk和gb2312之间的转换没有乱码是因为gbk是gb2312的增强版本,支持更多的汉字编码,所以如果二进制编码格式是gbk而解码格式是gb2312,这种情况是有可能出现部分汉字乱码的.

乱码的数据可以转变回来吗?

上述结果中的乱码其实可以大致分为两种,一种是复杂的汉字和图形组合,一种是"?".

如果希望恢复的乱码数据中有问号,那么这条数据恢复的可能性就不大了.因为除了"?"的其他乱码其实都是有自己的编码规则的,只要逆向的解码并按照正确的编码格式重新编码就可以恢复.但是"?"除外,因为当字节流按照某种编码格式重新编译的时候,字节数据中无法按照该编码格式转换成有意义字符的字节都会转换成"?",所以就算逆向的编码成字节流,所有的"?"都会转换成同一字节,也就失去了他本身的意义.

如果乱码中不包含"?",那么还是有希望转换回去的,我以上述乱码中的 "褰╄櫣" 为例重新进行了一次转换,代码如下:

       String str="褰╄櫣";
        String [] charset=new String[] {"gbk","unicode","utf8","gb2312"};
        for (int i=0;i<charset.length;i++){
            for (int j=0;j<charset.length;j++){
                System.out.println("二进制格式:   "+charset[i]+"编码格式:  "+charset[j]);
                System.out.println("编码后的字符串:  "+new String(str.getBytes(charset[i]),charset[j]));
 
            }
        }

二进制格式:   gbk编码格式:  gbk
编码后的字符串:  褰╄櫣
二进制格式:   gbk编码格式:  unicode
编码后的字符串:  ꧨ馹
二进制格式:   gbk编码格式:  utf8
编码后的字符串:  彩虹
二进制格式:   gbk编码格式:  gb2312
编码后的字符串:  褰╄��
二进制格式:   unicode编码格式:  gbk
编码后的字符串:  ��0%Dj�
二进制格式:   unicode编码格式:  unicode
编码后的字符串:  褰╄櫣
二进制格式:   unicode编码格式:  utf8
编码后的字符串:  ���0%Dj�
二进制格式:   unicode编码格式:  gb2312
编码后的字符串:  ���0%Dj�
二进制格式:   utf8编码格式:  gbk
编码后的字符串:  瑜扳晞娅�
二进制格式:   utf8编码格式:  unicode
编码后的字符串:  냢閄�
二进制格式:   utf8编码格式:  utf8
编码后的字符串:  褰╄櫣
二进制格式:   utf8编码格式:  gb2312
编码后的字符串:  瑜扳��娅�
二进制格式:   gb2312编码格式:  gbk
编码后的字符串:  褰╄?
二进制格式:   gb2312编码格式:  unicode
编码后的字符串:  ꧨ�
二进制格式:   gb2312编码格式:  utf8
编码后的字符串:  彩�?
二进制格式:   gb2312编码格式:  gb2312
编码后的字符串:  褰╄?

可以看到 其中一种转换方式成功的将乱码转变回了正常的中文汉字

二进制格式:   gbk编码格式:  utf8
编码后的字符串:  彩虹

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java中的编码转换过程(以utf8和gbk为例)

本文链接: https://www.lsjlt.com/news/209281.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java中的编码转换过程(以utf8和gbk为例)
    目录java中的编码转换(以utf8和gbk为例)以下是针对以上情况的代码测试java编码格式的转换以及乱码恢复如何在java中进行编码格式转换首先什么情况会乱码为什么gbk,gb2...
    99+
    2023-05-15
    java中的编码 java编码转换 java utf8和gbk
  • php中怎么进行utf8和gbk编码的转换
    在进行网站开发时,会经常用到字符编码的转换。其中一种常见的转换是将UTF-8编码转换成GBK编码。本文将介绍如何使用PHP进行UTF-8和GBK编码之间的转换。一、UTF-8编码和GBK编码的区别UTF-8编码和GBK编码都是常见的字符编码...
    99+
    2023-05-14
  • nodejs中如何将编码gbk转为utf8
    本篇内容介绍了“nodejs中如何将编码gbk转为utf8”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本...
    99+
    2024-04-02
  • php中如何进行utf8和gbk编码的转换
    本文小编为大家详细介绍“php中如何进行utf8和gbk编码的转换”,内容详细,步骤清晰,细节处理妥当,希望这篇“php中如何进行utf8和gbk编码的转换”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、UTF...
    99+
    2023-07-06
  • java中的编码转换过程是什么
    在Java中,编码转换的过程通常包括以下几个步骤:1. 读取输入数据:首先,从输入源(例如文件、网络连接或内存)中读取原始的字节数据...
    99+
    2023-08-16
    java
  • java编码转换过程是怎样的
    本文小编为大家详细介绍“java编码转换过程是怎样的”,内容详细,步骤清晰,细节处理妥当,希望这篇“java编码转换过程是怎样的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。java中的编码转换(以utf8和gb...
    99+
    2023-07-06
  • Java Unicode和中文编码转换
            今天在开发项目的时候,第三方提供的接口返回的数据是经过Unicode编码的,我们使用的时候多有不便,所以经过代码将Unicode解码才能使用,故记录一下使用Java进行Unicode和中文的互转。通常我们在安全优先级不是特...
    99+
    2023-09-02
    java 开发语言
  • 网站建设中编码转码工具实现utf-8与gbk转换的方法
    这篇文章给大家介绍网站建设中编码转码工具实现utf-8与gbk转换的方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。所以最好的方法是直接使用编码转换软件,我用的软件是convertz,貌似这个软件N年前开发出来后就没...
    99+
    2023-06-12
  • Java编程IP地址和数字相互转换代码示例
    最近才知道,将ip地址转换成十进制、八进制、十六进制同样可以访问网站。IP转为数字(第二种算法。用左移、按位或实现。效率更高。):public long ipToLong(String ipAddress) { long result =...
    99+
    2023-05-30
    java ip地址 相互
  • Java中将base64编码字符串转换为图片的代码
    前一段时间,在做摄像头拍照上传,摄像头拍的照片为base64编码格式的字符串,需要上传至项目中,则需要使用到将base64编码字符串转换为图片 1、将base64编码字符串转换为图片...
    99+
    2023-03-19
    Java base64编码字符串转换为图片 Java base64转换图片 Java base64编码转换
  • python中json和字符编码的转换
    json是用来转换python object 和json format 的,字符编码有gb2312,gb18030/gbk,utf-8等。在 Python 中出现的 str 都是用字符集编码的 ansi 字符串。Python 本身并不知道 ...
    99+
    2023-01-31
    字符 python json
  • Java中怎么将base64编码字符串转换为图片
    本篇内容介绍了“Java中怎么将base64编码字符串转换为图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!将base64编码字符串转换为...
    99+
    2023-07-05
  • 详解C++中的ANSI与Unicode和UTF8三种字符编码基本原理与相互转换
    目录1、概述2、Visual Studio中的字符编码3、ANSI窄字节编码4、Unicode宽字节编码5、UTF8编码6、如何使用字符编码7、三种字符编码之间的相互转换(附源码)7...
    99+
    2024-04-02
  • PHP中的字符编码和转换技术
    PHP是一种极其流行的服务器端编程语言,它被广泛应用于开发Web应用程序。为什么PHP如此受欢迎?其中一个原因是PHP具有良好的字符编码和转换技术,这使得它能够处理来自世界各地的文本数据,包括不同的字符集和语言。本文将从以下三个方面探讨PH...
    99+
    2023-05-14
    PHP编程 字符编码 转换技术
  • java中文编码转换的方法有哪些
    Java中常用的编码转换方法有以下几种:1. 使用`String`类的构造方法:```javaString str = new St...
    99+
    2023-08-16
    java
  • Python中将秒转换为小时、分钟和秒的示例代码
    目录在 Python 中使用数学计算将秒转换为小时、分钟和秒的自定义函数在 Python 中使用 divmod() 函数将秒转换为小时、分钟和秒在 Python 中使用 DateTi...
    99+
    2023-05-19
    python秒转换小时 python秒转换分钟 python秒转换分钟和秒
  • vbs实现unicode和ascii编码转换的方法教程
    本篇内容主要讲解“vbs实现unicode和ascii编码转换的方法教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vbs实现unicode和ascii编码转换的方法教程”吧!一、Copy a...
    99+
    2023-06-08
  • java编程两种树形菜单结构的转换代码
    首先看看两种树形菜单结构的代码示例。SingleTreeNode:package com.zzj.tree;public class SingleTreeNode {private int id;private int pId;privat...
    99+
    2023-05-30
    java 树形菜单 转换
  • Linux中的编码转换程序convmv的安装和使用教程是怎样的
    今天就跟大家聊聊有关Linux中的编码转换程序convmv的安装和使用教程是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。今天介绍个文件名转码的工具--convmv,convm...
    99+
    2023-06-12
  • 转换文本为超连接和Email格式的代码284475实例
    如果用户输入了http://aaa.bbb.ccc下面这个代码将把他的输入转换成http://aaa.bbb.ccc大家看看正则表达式有多厉害,呵呵。<%  &nbs...
    99+
    2023-05-20
    转换文本为超联和Email格式的代码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作