Java中如何将八进制字符序列转换为unicode

Viv*_*ari 3 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,其等效的 unicode 是\u201C

是否有任何库或函数可以用来将这些八进制序列转换为其等效的 unicode 序列?

dav*_*085 5

您显示的字节是 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));
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要更接近原始内容的内容,您可以通过将实际上包含 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));
Run Code Online (Sandbox Code Playgroud)