java utf16 encoding

Unicode的码空间从U+0000到U+10FFFF
UTF16分为17个多文种平面(multilingual plane),其中基本多文种平面的范围是0x0000-0xFFFF,其他的成为辅助文本平面.
基本多文种平面的每个编码对应一个字符,或称作代码元,特殊的情况是:
U+D800到U+DFFF之间的码位区段是永久保留不映射到字符,因此UTF-16利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。

从u+10000到u+10ffff的码位
辅助平面(Supplementary Planes)中的码位,在UTF-16中被编码为一对16比特长的码元(即32bit,4Bytes),称作 code units called a 代理对(surrogate pair), 具体方法是:
码位减去0x10000, 得到的值的范围为20比特长的0..0xFFFFF.
高位的10比特的值(值的范围为0..0x3FF)被加上0xD800得到第一个码元或称作高位代理(high surrogate), 值的范围是0xD800..0xDBFF. 由于高位代理比低位代理的值要小,所以为了避免混淆使用,Unicode标准现在称高位代理为前导代理(lead surrogates).
低位的10比特的值(值的范围也是0..0x3FF)被加上0xDC00得到第二个码元或称作低位代理(low surrogate), 现在值的范围是0xDC00..0xDFFF. 由于低位代理比高位代理的值要大,所以为了避免混淆使用,Unicode标准现在称低位代理为后尾代理(trail surrogates).


由于高位代理、低位代理、BMP中的有效字符的码位,三者互不重叠,搜索是简单的: 一个字符编码的一部分不可能与另一个字符编码的不同部分相重叠。这意味着UTF-16是自同步(self-synchronizing): 可以通过仅检查一个码元就可以判定给定字符的下一个字符的起始码元. UTF-8也有类似优点,但许多早期的编码模式就不是这样,必须从头开始分析文本才能确定不同字符的码元的边界.(这是因为所有从u+10000到u+10ffff的码位全都表示成了一对16比特长的码元,而前一个码元落在0xD800..0xDBFF,后一个码元落在0xDC00..0xDFFF.所以,只要你发现有一个码元处于0xD800..0xDfFF,那么这个码元一定是UTF16编码的一个部分,而且你能确定他是高位代理或者是低位代理.)
### Java 中处理 UTF-8 编码问题的解决方案 在 Java 中遇到 `unsupported content encoding utf-8` 的错误通常是因为程序尝试读取或写入的内容未被正确识别为 UTF-8 编码。以下是详细的分析和解决方法: #### 1. 设置 JVM 参数 确保启动应用程序时设置了 `-Dfile.encoding=UTF-8` 参数,这可以强制 JVM 使用 UTF-8 作为默认字符集[^1]。 ```bash java -Dfile.encoding=UTF-8 -jar your-application.jar ``` #### 2. 明确指定文件流编码 当操作文件输入输出流时,应显式设置编码方式为 UTF-8,而不是依赖系统的默认编码。例如,在读取文件时可使用如下代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; public class Utf8Reader { public static void main(String[] args) throws Exception { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, "UTF-8"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } } } ``` 上述代码通过 `InputStreamReader` 构造函数指定了 `"UTF-8"` 编码[^3]。 #### 3. 配置 Web 应用中的请求响应编码 如果是在开发基于 Servlet 或 JSP 的 Web 应用,则需配置 HTTP 请求和响应的编码格式。可以在过滤器中统一设置: ```java response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); ``` 对于 Spring Boot 用户,可以通过以下方式全局设定编码: ```yaml server: tomcat: uri-encoding: UTF-8 spring: http: encoding: charset: UTF-8 enabled: true force: true ``` #### 4. 数据库连接字符串中的编码参数 数据库交互过程中也可能引发类似的编码异常。以 MySQL 连接为例,应在 JDBC URL 后附加 `useUnicode=true&characterEncoding=UTF-8` 参数来保障数据传输的一致性[^4]。 ```properties jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8 ``` 以上措施能够有效应对大多数场景下的 UTF-8 支持不足的情况。然而需要注意的是,实际应用环境中很少会频繁涉及字符数量统计等问题,因此除非必要,一般无需特别关注此方面功能实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值