Java基础教程(三十八)Java核心类之字符串和编码:Java字符串编码,你的代码暗藏“乱码刺客“?

一、字符串本质:Unicode字符的不可变舞者💃

Java字符串(String)是不可变的Unicode字符序列。底层使用char[]存储,每个char占2字节,代表一个UTF-16代码单元:

String str = "Javα"; // 'α' 占用1个char (Unicode:03B1)
System.out.println(str.length()); // 输出:4

但UTF-16仅是存储编码!与外界的字节数据交互时,需进行显式编/解码:

byte[] utf8Bytes = str.getBytes(StandardCharsets.UTF_8); // 编码为UTF-8字节流
String decoded = new String(utf8Bytes, StandardCharsets.UTF_8); // 字节流解码回字符串

二、编码陷阱:默认编码的"刺客"行为⚔️

致命错误:依赖平台默认编码转换:

// 危险操作!依赖默认编码
byte[] data = "你好".getBytes(); 
String recovered = new String(data); // 若默认编码不一致,乱码!

示例证明:

String text = "你好";
// 模拟不同平台编码
byte[] gbkBytes = text.getBytes("GBK");    // [ -60, -29, -70, -61 ]
byte[] utf8Bytes = text.getBytes(StandardCharsets.UTF_8); // [ -28, -67, -96, -27, -91, -67 ]

// 用错误编码解码 -> 乱码
System.out.println(new String(gbkBytes, StandardCharsets.UTF_8)); // 输出:���
System.out.println(new String(utf8Bytes, "GBK"));                // 输出:浣犲ソ

三、关键结论:驯服编码的利剑🗡️

  1. 永不信任默认编码:始终在getBytes()和String构造函数中显式指定字符集(如StandardCharsets.UTF_8)。
  2. 统一字符集:系统、数据库、网络传输强制使用UTF-8。
  3. 理解char局限:char无法完整表示所有Unicode字符(如😊需2个char即代理对),处理复杂文本用codePoint相关API。
  4. 性能优化:大量字符串操作考虑StringBuilder或StringBuffer(线程安全)。

警钟:忽视编码等于埋下"乱码刺客",轻则显示异常,重则数据永久损坏。显式指定字符集,是每位Java开发者的生存技能!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值