首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ucs-4转换为ucs-2

将ucs-4转换为ucs-2
EN

Stack Overflow用户
提问于 2019-09-16 09:37:49
回答 2查看 393关注 0票数 0

ucs-4字符'‘的unicode值为0001f923,在intelliJ IDEA中将其复制到java代码时自动更改为相应的\uD83E\uDD23值。

Java只支持ucs-2,所以会发生从ucs-4到ucs-2的转换.

我想知道这个转变的逻辑,但是没有找到任何关于它的材料。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-16 10:11:00

U+10FFFF

U+010000 to U+10FFFF

  • 从代码点(U)减去0x10000,在0x000000xFFFF范围内留下一个20位数(U')。U被定义为不大于0x10FFFF。
  • 将高10位(在0x000-0x3FF范围内)添加到0xD 800中,以给出第一个16位代码单元或高代理项(W1),这将在0xD800-0xDBFF范围内。
  • 将低10位(也在0x000-0x3FF范围内)添加到0xDC00,以给出第二个16位代码单元或低代理项(W2),这将在0xDC00-0xDFFF范围内。

现在具有输入代码点\U1F923:

  • U1F923-\U 10000=UF923
  • UF923= 1111100100100011 = 00001111100100100011 = 0000111110 = \U3E
  • U3E 800+U3E=UD83E
  • UDC00 00+U 123=UDD23 23
  • 结果:\UD83E\UDD23 23

Programming:

代码语言:javascript
复制
public static void main(String[] args) {
    int input = 0x1f923;
    int x = input - 0x10000;

    int highTenBits = x >> 10;
    int lowTenBits = x & ((1 << 10) - 1);

    int high = highTenBits + 0xd800;
    int low = lowTenBits + 0xdc00;

    System.out.println(String.format("[%x][%x]", high, low));
}
票数 2
EN

Stack Overflow用户

发布于 2019-09-16 11:27:00

尽管String将Unicode包含为一个char数组,其中char是一个2字节的UTF-16BE编码,但也支持UCS4。

UCS4: UTF-32,“代码点”:

Unicode代码点( UCS4 )在java中表示为int

代码语言:javascript
复制
int[] ucs4 = new int[] {0x0001_f923};
String s = new String(ucs4, 0, ucs4.length);
ucs4 = s.codePoints().toArray();

有编码,转换,代码点的UTF-16和UTF-8,需要更长的序列分别为2字节或1字节值.选择编码时,2/1字节值将与任何其他值不同。这意味着这样的值不会错误地匹配"/"或任何其他字符串搜索。这是通过从1...开始的高比特实现的,然后是大端格式的代码点(最重要的第一位)。

而不是搜索UCS4和UCS2,搜索UTF-16将产生有关所使用算法的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57954090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档