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

时间:2018-05-30 07:09:01

标签: java unicode

您好有以下字符串,

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等效项为\u2019

类似地,\342\200\234表示八进制序列http://graphemica.com/%E2%80%9C,其等效字节为\u201C

我可以使用任何库或函数将这些八进制序列转换为它们的unicode等价物吗?

2 个答案:

答案 0 :(得分:3)

您显示的字节是(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字节的字符串( unsigned 字符)来作弊,就像它包含8位一样形成Unicode的字符范围为0000-00FF,定义为与ISO-8859-1相同:

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

答案 1 :(得分:0)

在Java中,Octals无法实现这一点,只能使用Hexa。

这很好用:

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

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

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