繁体   English   中英

如何在Java中将八进制char序列转换为unicode

[英]How to convert octal char sequence to unicode in Java

嗨有以下字符串,

Let\\342\\200\\231s start with the most obvious question first. This is what an \\342\\200\\234unfurl\\342\\200\\235 is

它应该显示为前三个数字( \\342\\200\\231 )实际上代表一个八进制序列http://graphemica.com/%E2%80%99 ,它的unicode等价物是\’

类似地, \\342\\200\\234代表八进制序列http://graphemica.com/%E2%80%9C ,其unicode等价物是\“

是否有任何库或函数可用于将这些八进制序列转换为它们的unicode等价物?

您显示的字节是(UTF-8编码的表示),它只是许多Unicode形式中的一种。 Java旨在处理诸如字节序列(例如数组,以及流)之类的编码,但不能用作字符和字符串。 更简洁的方法是实际使用字节,但是你必须处理Java字节被签名的事实(-128 .. +127)和所有多字节UTF-8代码(按设计)在8的上半部分位空间:

byte[] a = {'L','e','t',(byte)0342,(byte)0200,(byte)0231,'s'};
System.out.println (new String (a,StandardCharsets.UTF_8));
// or arguably uglier
byte[] b = {'L','e','t',0342-256,0200-256,0231-256,'s'};
System.out.println (new String (b,StandardCharsets.UTF_8));

但是如果你想要更接近原作的东西,你可以通过处理实际包含UTF-8字节的字符串( 无符号字符)来作弊,就好像它包含形成Unicode范围0000-00FF的8位字符,这是定义为与ISO-8859-1相同:

byte[] c = "Let\342\200\231s".getBytes(StandardCharsets.ISO_8859_1);
System.out.println (new String (c,StandardCharsets.UTF_8));

在Java中,Octals不可能实现这一点,只有Hexa才能实现。

这很好用:

System.out.println("\u2019");

可能纯粹由于历史原因,Java支持八进制转义序列。 这些逃逸序列起源于C(或者可能是C的前身B和BCPL),在像PDP-7这样的计算机统治地球的时代,大量编程是在汇编或直接在机器代码中完成的,而八进制是首选的数字用于编写指令代码的基础,并且没有Unicode,只有ASCII,因此三个八进制数字足以表示整个字符集。

当Unicode和Java出现时,八进制几乎已经让位于十六进制作为首选数字基数,而十进制不会这样做。 所以Java的\\ u转义序列采用十六进制数字。 可能只支持八进制转义序列以使C程序员感到舒服,并且可以很容易地将C程序中的字符串常量复制到Java程序中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM