簡體   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