UTF-16编码规则:

按照UTF-16编码规则计算下Unicode码位为 U+10002 (十进制:65538)的字符的UTF-16编码表示。

U+10002落在 [U+10000, U+10FFFF] 区间内。其UTF-16编码需要用四字节16位。

1、码位减去0x10000,0x10002 - 0x10000得到 0x02,即 0000000000 0000000010(20位比特)

2、高10位加上0xD800,0x00 + 0xD800得到 0xD800,即 1101 1000 0000 0000 (16位比特)

3、低10位加上0xDC00,0x02 + 0xDC00得到 0xDC02,即1101 1100 0000 0000 (16位比特)

4、所以U+10002的UTF-16编码表示位:0xD800DC02 ,即11011000 00000000 11011100 00000000(32位比特)

通过UTF-16编码,反推其Unicode码位:

1、UTF-16编码:0xD800DC02 ,即11011000 00000000 11011100 00000000(32位)。

2、前两个字节(16位)0xD800  减去 0xD800 得到 0x00,即 00 00000000(10位)

3、后两个字节(16位)0xDC02 减去 0xDC00 得到 0x02,即 00 00000010(10位)

4、0x00 和 0x02组合起来拼成0x02,即 0000 00000000 00000010(20位比特)

5、0x02 加上 0x10000 得到 0x10002,其Unicode码表示为U+10002,十进制即65538。

通过代码查看U+10002的utf-16be编码:

输出:

utf-16be编码
16进制:d8 0 dc 2
====================
2
65538
true
56322
true

由输出可只U+10002的UTF-16BE编码表示是:D8 00 DC 02,由4字节表示。

codePointAt()方法:

 public int codePointAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return Character.codePointAtImpl(value, index, value.length);
} ============================================================================== static int codePointAtImpl(char[] a, int index, int limit) {
char c1 = a[index];
// utf-16四字节编码的字符,第一个码位(16位)的范围是 ['\uD800', '\uDBFF')
if (isHighSurrogate(c1) && ++index < limit) {
char c2 = a[index];
// 第二个码位(16位)的范围是 ['\uDC00', '\uDFFF')
if (isLowSurrogate(c2)) {
return toCodePoint(c1, c2);
}
}
// 2字节UTF-16编码则直接返回该2字节。
// 4字节UTF-16编码的第二个codePoint则直接返回该4字节中的后2字节。
return c1;
} ============================================================================== public static final char MIN_HIGH_SURROGATE = '\uD800';
public static final char MAX_HIGH_SURROGATE = '\uDBFF'; public static final char MIN_LOW_SURROGATE = '\uDC00';
public static final char MAX_LOW_SURROGATE = '\uDFFF'; public static final int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000; ============================================================================== public static boolean isHighSurrogate(char ch) {
// Help VM constant-fold; MAX_HIGH_SURROGATE + 1 == MIN_LOW_SURROGATE
return ch >= MIN_HIGH_SURROGATE && ch < (MAX_HIGH_SURROGATE + 1);
}
public static boolean isLowSurrogate(char ch) {
return ch >= MIN_LOW_SURROGATE && ch < (MAX_LOW_SURROGATE + 1);
} ============================================================================== // 根据4字节(32位)UTF-16编码求Unicode码位(通过UTF-16编码,反推其Unicode码位)
public static int toCodePoint(char high, char low) {
// Optimized form of:
// return ((high - MIN_HIGH_SURROGATE) << 10)
// + (low - MIN_LOW_SURROGATE)
// + MIN_SUPPLEMENTARY_CODE_POINT;
return ((high << 10) + low) + (MIN_SUPPLEMENTARY_CODE_POINT
- (MIN_HIGH_SURROGATE << 10)
- MIN_LOW_SURROGATE);
}
==============================================================================

isSupplementaryCodePoint()方法:

 public static final int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000;
public static final int MAX_CODE_POINT = 0X10FFFF; =================================================================
// 根据Unicode number判断字符是否在增补字符范围
public static boolean isSupplementaryCodePoint(int codePoint) {
return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT
&& codePoint < MAX_CODE_POINT + 1;
}

小demo,输出字符的Unicode number的十进制形式:

 public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
// str的第二个字符的Unicode码是U+10002
// 10进制65538
// UTF-16BE编码二进制11011000 00000000 11011100 00000010
String str = "A

最新文章

  1. AnimatedModal.js – CSS3 全屏模态窗口
  2. 立即执行函数: (function(){...})() 与 (function(){...}()) 有什么区别?
  3. effetive C++ 02 尽量以const,enum,inline替换#define
  4. 排序算法 ----(转载::http://blog.csdn.net/hguisu/article/details/7776068)
  5. paip.python错误解决23
  6. Ubuntu 14 编译安装 XDebug - 2.3.3 For PHP - 5.4.45
  7. javascript中对象学习
  8. windows系统查看80端口被占用的程序并结束该程序运行
  9. 如何使用本地yum源?
  10. UIImageJPEGRepresentation和UIImagePNGRepresentation
  11. 如何开启ubuntu的SSH服务(不要和openssl搞混淆了)
  12. IOS 控件的生命周期
  13. wireshark: there are no interfaces on which a capture can be done
  14. linux sed 批量替换多个文件中的字符
  15. C#中的深拷贝与浅拷贝
  16. SpringBoot学习之基础篇
  17. Dos.Common
  18. GFF高仿QQ客户端及服务器
  19. Tbox在整车CAN网络的位置与作用
  20. 实现web消息推送的技术和采用长轮询corundumstudio介绍

热门文章

  1. centos下面配置key登录
  2. VS2008重置默认环境
  3. 前端必须掌握的 nginx 技能(1)
  4. C#SQL小结
  5. Unity UI —Text
  6. WebMvcConfigurer 与 WebMvcConfigurationSupport避坑指南
  7. QA的工作职责是什么?
  8. django连接数据库的类型
  9. 爬虫三之beautifulsoup
  10. kafka学习(四)