常见编码&解码,以及为什么会出现乱码呢?如何准确检查字符长度?

本文详细介绍了字符编码的概念,包括Unicode和UTF-8的区别与转换过程。通过举例说明了在文本编辑、网页浏览中的角色,以及编码、解码过程中可能出现的乱码问题。强调了在处理字符串到字节数组、字节数组到字符串的转换时,正确选择编码方式的重要性,并提供了检查字符串长度和获取JDK字符集的方法。
摘要由CSDN通过智能技术生成

在这里插入图片描述

常见 编码 与 解码

字符 编码

将字符串→字节序列

byte[] b_utf8     = "知".getBytes("UTF-8");     // [-25, -97, -91]
byte[] b_gbk      = "知".getBytes("GBK");       // [-42, -86]
byte[] b_unicode  = "知".getBytes("unicode");   // [-2, -1, 119, -27]
byte[] b_iso88591 = "知".getBytes("ISO8859-1"); // [63] 所有中文都是这个数值,因为不识别

String s_utf8     = new String(b_utf8, "UTF-8");         // 知
String s_gbk      = new String(b_gbk, "GBK");            // 知
String s_unicode  = new String(b_unicode, "unicode");    // 知
String s_iso88591 = new String(b_iso88591, "ISO8859-1"); // ?  encode都是不对的,decode指定是错的

URL 编码

将字符串→被特殊处理的字符串(非字节序列)

String str = URLEncoder.encode("知", "utf-8");          // %E7%9F%A5
String str = URLDecoder.decode("%E7%9F%A5", "utf-8");   // 知

Base64 编码

将字符串→编码后的字符串(非字节序列)

import java.nio.charset.StandardCharsets;
import java.util.Base64;

byte[] bytesToEncode = originalString.getBytes(StandardCharsets.UTF_8);
String encodedString = Base64.getEncoder().encodeToString(bytesToEncode);
// Hello, World! → SGVsbG8sIFdvcmxkIQ==

--------------------------------------------------
import java.nio.charset.StandardCharsets;
import java.util.Base64;

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String originalString = new String(decodedBytes, StandardCharsets.UTF_8);
// SGVsbG8sIFdvcmxkIQ== → Hello, World!

JSON 编码(JavaScript Object Notation)

对象→JSON 格式的字符串
什么是序列化与反序列化?
[实践总结] Json 和 JavaObject 互相转换

在这里插入图片描述

[Q&A] 为什么会出现乱码呢?

编码解码 时用了不同或者不兼容的字符集。

[Q&A] UTF-8 为何被视为字符集?

UTF-8 是一种编码规则,而不是字符集。早期字符集和编码规则的概念没有严格区分,再加上这种用法已经深入人心。可以直接指定 charset=UTF-8 表示UTF-8 与 Unicode 的组合。

在这里插入图片描述

应用场景

字节数组作为中间编码

# 为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码)

String aaa = new String("知".getBytes("UTF-8"), "ISO8859-1"); 
//把 '知' 按照 UTF-8 encode ---> [-25, -97, -91] 再按照 ISO8859-1 decode 成 乱码'知'

String bbb = new String(aaa.getBytes("ISO8859-1"), "UTF-8");  
//把乱码'知' 按照 ISO8859-1 encode ---> [-25, -97, -91], 再按照 UTF-8 decode 成 '知'

准确检查字符长度

在开发时会检查字符长度,以免数据库字段的长度不够而报错,考虑到中英文的差异,肯定不能用String.length()方法判断,而需采用String.getBytes().length;还可以用指定编码方式查看长度String.getBytes("GBK").length

获取jdk的 charset

Set<String> charsetNames = Charset.availableCharsets().keySet();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值