在Java里Charset类如何处理字符编码_Java编码转换解析-java教程

charset.forname() 不抛 unsupportedencodingexception,而是抛 illegalargumentexception;真正抛该异常的是 string.getbytes(string) 等老式 api;jdk 7+ 内置常见编码,但需传标准 iana 名称(如 “utf-8″),避免别名或拼写错误。

Charset.forName() 为什么抛出 UnsupportedEncodingException?

这个异常其实不会在 Charset.forName() 中抛出——它声明抛出的是 IllegalArgumentException。真正抛出 UnsupportedEncodingException 的是老式 API,比如 String.getBytes(String) 或 new String(byte[], String)。这是初学者最容易混淆的点。

根本原因在于:JDK 7+ 内置了所有常见编码(UTF-8、ISO-8859-1、GBK、US-ASCII 等),只要传入标准名称(如 "UTF-8",注意连字符不能写成下划线或空格),Charset.forName() 就不会失败;但若传入 "utf8"(缺连字符)、"GB2312 "(尾部空格)、"utf-8"(小写连字符实际可接受,但大小写混用如 "Utf-8" 在某些旧 Android 版本可能挂)就可能触发异常或返回 null。

  • 始终用 Charset.availableCharsets().keySet() 查看当前 JVM 实际支持的名称列表
  • 优先使用 StandardCharsets.UTF_8 这类静态常量,完全避免字符串拼写风险
  • 如果必须用字符串,只从 IANA 注册名中选(如 "UTF-8"、"ISO-8859-1"、"GBK"),不依赖平台别名

Charset.encode() 和 String.getBytes(Charset) 的行为差异

Charset.encode() 接收 CharBuffer,返回 ByteBuffer,走的是 NIO 编码通道;而 String.getBytes(Charset) 是传统 IO 路径,内部也调用 Charset.encode(),但做了额外封装(比如自动处理 BOM、处理替换策略)。两者在默认配置下结果一致,但关键区别在错误处理上。

  • Charset.encode() 默认使用 CodingErrorAction.REPORT,遇到无法编码的字符(如用 ISO-8859-1 编码中文)直接抛 CharacterCodingException
  • String.getBytes(Charset) 则默认静默替换为 ?(取决于 Charset 的 newEncoder() 配置)
  • 想让 Charset.encode() 也替换而非报错,需手动设置:charset.newEncoder().onUnmappableCharacter(CodingErrorAction.REPLACE)

GBK 和 GB2312 编码在 Java 里能互换使用吗?

不能直接互换,尽管 GBK 是 GB2312 的超集。Java 中 "GBK" 和 "GB2312" 对应不同 Charset 实例,它们的 newDecoder() 行为不同:用 GB2312 解码一个纯 GBK 扩展字(如“镕”、“啰”)会抛 MalformedInputException;反过来,用 GBK 解码 GB2312 文本完全没问题。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java里Charset类如何处理字符编码_Java编码转换解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997136+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997137+
  • 本周更新: 0+
  • 最后更新: 2026-03-16