Java 字符转码之UTF-8互转GBK

这篇具有很好参考价值的文章主要介绍了Java 字符转码之UTF-8互转GBK。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java UTF-8转GBK详解

java跟python类似的做法,在java中字符串的编码是java修改过的一种Unicode编码,所以看到java中的字符串,心理要默念这个东西是java修改过的一种Unicode编码的编码。

package string;

import java.nio.charset.Charset;


public class UTF82GBK {

    public static void main(String[] args) throws Exception {
        //系统的默认编码是GBK
        System.out.println("Default Charset=" + Charset.defaultCharset());
        String t = "hfjkds中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国hfsdkj<img src=‘sasa‘ /> fjldsajflkdsjaflkdsjalf <img src=‘sada‘ ait=‘‘/>sfdsfadas";  
        //思路:先转为Unicode,然后转为GBK
        String utf8 = new String(t.getBytes( "UTF-8"));
        //等同于:
//        String utf8 = new String(t.getBytes( "UTF-8"),Charset.defaultCharset());
        
        System.out.println(utf8);  
        String unicode = new String(utf8.getBytes(),"UTF-8");   
        //等同于:
//        String unicode = new String(utf8.getBytes(Charset.defaultCharset()),"UTF-8");   
        System.out.println(unicode);  
        String gbk = new String(unicode.getBytes("GBK"));  
        //等同于:
//        String gbk = new String(unicode.getBytes("GBK"),Charset.defaultCharset());  
          
        System.out.println(gbk);  
    }

}
package com.mkyong;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
 
public class UTF8ToGBK {
    public static void main(String[] args) throws Exception {
 
        File fileDir = new File("/home/user/Desktop/Unsaved Document 1");
 
        BufferedReader in = new BufferedReader(new InputStreamReader(
                new FileInputStream(fileDir), "UTF-8"));
 
        String str;
 
        while ((str = in.readLine()) != null) {
            System.out.println(str);// java内部只有unicode编码 所以str是unicode编码
            String str2 = new String(str.getBytes("GBK"), "GBK");// str.getBytes("GBK")是gbk编码,但是str2是unicode编码
            System.out.println(str2);
        }
 
        in.close();
    }
}

 问题的关键是new String(xxx.getBytes("gbk"), "gbk")这句话是什么意思,xxx.getBytes("gbk")得到的数组编码是GBK,因此必须必须告诉java:我传给你的数组是gbk编码的,你在转换成你内部的编码的时候记得要进行一些处理,new String(xxx.getBytes("gbk"), "gbk"),这句话第二个“gbk”是告诉java传递给它的是gbk编码的字符串。

String fullStr = new String(str.getBytes("UTF-8"), "UTF-8");//正常
String fullStr2 = new String(str.getBytes("UTF-8"), "GBK");//不正常,java内置的编码->utf8  被当成GBK编码转换成java内置的编码

看一下jdk文档是怎么说的

public String(byte[] bytes,
      Charset charset)

Constructs a new String by decoding the specified array of bytes using the specified charset.

那现在的问题就是,我怎么在String中持有GBK编码的东西呢?

String str3 = new String(str.getBytes("GBK"),"ISO-8859-1");
System.out.println(new String(str3.getBytes("ISO-8859-1"),"GBK"));

Java GBK转UTF-8详解

Java语言是一种编程语言,它是一个高级的、面向对象的、平台无关的语言。Java主要是用来构建Web应用程序,而在Java Web应用程序中将字符串编码变成UTF-8是非常有必要的。在本文中,我们将从多个方面详细探讨Java GBK转UTF-8。

一、转换原理

GBK编码和UTF-8编码是两种不同的编码格式。GBK编码是一种多字节编码方式,每个汉字占用两个字节存储,因此在文本处理中经常遇到GBK编码转UTF-8编码的需求。UTF-8编码是一种字符编码方式,与ASCII码兼容,可以支持从U+0000至U+10FFFF范围内的所有字符。

在Java程序中,字符串默认的编码方式是UTF-16编码,因此需要将GBK编码转换为UTF-8编码,主要是为了避免出现乱码的情况。通过Java的相关API来实现将GBK编码转换为UTF-8编码。

二、具体实现

1.使用InputStreamReader和OutputStreamWriter转换文件编码

    FileInputStream fileInputStream = new FileInputStream("gbk.txt");
    InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK");

    FileOutputStream fileOutputStream = new FileOutputStream("utf-8.txt");
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");

    int length = 0;
    char[] buffer = new char[1024];

    while ((length = inputStreamReader.read(buffer)) != -1) {
        outputStreamWriter.write(buffer, 0, length);
    }

    outputStreamWriter.close();
    fileOutputStream.close();
    inputStreamReader.close();
    fileInputStream.close();

上述代码中,先使用FileInputStream和InputStreamReader读取GB2312编码的文件,然后再使用FileOutputStream和OutputStreamWriter将文件以UTF-8编码写入到新的文件中。

2.使用String.getBytes()方法转换字符串编码

    String strGBK = "这是一段GBK编码的字符串";
    byte[] bytes = strGBK.getBytes("GBK");
    String strUTF = new String(bytes,"UTF-8");
    System.out.println(strUTF);

上述代码中,我们先定义了一个字符串strGBK,将其转换成字节数组bytes,并指定编码方式为GBK。接着,通过String构造方法将字节数组bytes以UTF-8编码方式构建新的字符串strUTF,并进行输出。

3.使用编码转换器Charset实现编码转换

    String strGBK = "这是一段GBK编码的字符串";
    Charset gbkCharset = Charset.forName("GBK");
    Charset utf8Charset = Charset.forName("UTF-8");
    ByteBuffer byteBuffer = gbkCharset .encode(strGBK);
    CharBuffer charBuffer = utf8Charset .decode(byteBuffer);
    System.out.println(charBuffer.toString());

上述代码中,我们首先定义一个字符串strGBK,然后通过Charset的forName方法分别创建GBK编码和UTF-8编码的Charset,并使用GBK编码器将字符串转换成ByteBuffer,再通过UTF-8解码器将ByteBuffer转换成CharBuffer,最后输出转换后的字符串。

三、注意事项

在进行GB2312到UTF-8编码转换时,需要注意以下几点:

1.文本文件编码格式

在Java程序中,使用FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream等类进行文件读写时,需要明确文件的编码格式,否则会出现乱码等问题。

2.源代码文件编码格式

为了保证源代码文件编码格式的一致性,最好将所有的源文件均保存为UTF-8编码,否则可能会出现编译错误等问题。

3.字符串编码格式

在Java程序中,如果需要将字符串从GBK编码转换成UTF-8编码,需要使用String的getBytes()方法,同时指定源编码和目标编码。

四、总结

本文详细介绍了Java GBK转UTF-8的具体实现方法,包括文件编码转换、字符串编码转换和使用字符集Charset实现编码转换。在进行GB2312到UTF-8编码转换时,需要注意文本文件编码格式、源代码文件编码格式和字符串编码格式的一致性。文章来源地址https://www.toymoban.com/news/detail-743559.html

到了这里,关于Java 字符转码之UTF-8互转GBK的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 织梦GBK/GB2312转utf-8编码操作步骤(全站修改方法)

    目前MIP对编码是有严格要求,必须是UTF-8,那么对于大部分GBK或者GB2312的用户只能先将网站整体进行编码转换,才能进行MIP改造,不然改造后的页面是乱码一大片。 为什么MIP只支持utf-8?目前部分手机自带浏览器仅支持UTF-8,打开GBK的网站会出现乱码,所以为了手机的兼容性,

    2023年04月24日
    浏览(60)
  • 【Java】在代码中设置输出字符集为UTF-8

    今日无聊,来试试如何在 Java 代码中更改输出字符集。 其中我们要看的语句,其实只有一行 在设置Java程序的输出字符集为UTF-8。 System.setOut 是 Java标准库 中的一个静态方法,用于设置标准输出流。标准输出流是程序输出信息的默认位置,通常是控制台。 new PrintStream(System.o

    2024年02月06日
    浏览(33)
  • python,Pandas读取csv文件gbk编码和utf-8编码都报错

    用Pandas读取csv文件,read_csv(),使用默认的 encoding = ‘utf-8’ 和 encoding = ‘gbk’ 都报错,如下图。最终通过 统一编码方式 解决了,操作很简单,但是问题解决的探索过程并不是特别顺利,所以记录一下,给朋友们参考~ 统一编码方式,将csv文件的编码格式改为utf-8。 具体操作

    2024年01月16日
    浏览(71)
  • UTF-8、UTF-16、Unicode、GB2312、GBK、GB18030一次说清楚

    1、关于存储编码和显示编码的区别。 Unicode是显示编码,UTF-8、UTF-16、GB2312、GBK、GB18030都是存储/传输方面使用,也叫做存储编码、处理编码,你在计算机上看见的所有文字都从存储编码转成显示编码后,显示出来,当你单机保存时又从显示编码转换为存储编码存储起来。 2、

    2024年02月12日
    浏览(50)
  • java中http请求,记得加字符集 UTF-8,StringEntity

    http请求经常会遇到一些奇怪的问题,例如发送请求失败,或者response出现问题,或者参数中带了url调接口失败,调用微信接口失败,调用nginx转发失败,等等。 但用postman调用不会有问题。 这说明参数本身没有问题,服务器也没有问题,是客户端的问题。在你的代码里面,客

    2024年02月07日
    浏览(53)
  • UTF-8、GB2312、GBK、GB18030、ISO-8859-1(也称Latin-1):兼容ASCII编码

    ASCII码是单字节的,首位为0,后面表示的值就是Unicode码点,范围为0x00-0x7F,共表示128个字符。 UTF-8和ASCII兼容 :因为对于单字节的符号,UTF-8 编码和 ASCII 码是相同的, 所以 UTF-8 能兼容 ASCII 编码。 GB2312和ASCII兼容 :对于ASCII范围以内的字符,GB2312编码的机内码(不是区位码)

    2024年02月16日
    浏览(41)
  • 【错误记录】IntelliJ IDEA 中编译运行报错 ( 当前设置 GBK 编码 | 错误: 编码UTF-8的不可映射字�? )

    当前的 IntelliJ IDEA 设置的编码为 GBK 编码 , 选择 \\\" 菜单栏 / File / Settings \\\" 选项 , 在 \\\" File Encodings \\\" 中 , 查看 工程的编码 , 运行时报错 : 在中文注释的位置 , 编码报错 ; D:\\002_Project\\003_Java_WorkExsamplesrcmainjavaArrowCanvas.java:17 : 错误: 编码UTF-8的不可映射字�? // ����ֱ�� ^

    2024年02月14日
    浏览(51)
  • 设置Tomcat字符编码UTF-8

    我这里是Tomcat7,标签大概在70行左右

    2024年02月16日
    浏览(45)
  • Redis如何把字符集的编码格式设置为UTF-8

    一、问题复现(编码错乱)         刚安装好的redis在使用的过程中,若使用到了汉字,则在显示的时候,汉字是不能够正常显示的,因为redis在解析的过程中,会将汉字转换成其他编码的格式,如下图: 二、Redis支持哪些类型的编码?         Redis是一款开源的内存数据

    2024年02月02日
    浏览(46)
  • 字符集与字符编码(理解ASCII、ANSI、UTF-8、Unicode,解决各种乱码问题)

    相信很多同学也像我一样,经常在工作和学习中遇到字符编码的疑惑或者受到乱码的困扰,每次遇到问题都需要去学习了解不同的名词含义甚至需要深入学习不同的编码机制,不胜烦恼,所以今天我将自己的学习心得记录下来,希望能简单明了地描述字符集和字符编码。 首先

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包