2009-09-10 134 views
13

在我的Java應用程序,我已經在一個字符串被通過,看起來像這樣:打印字符串字面Unicode作爲實際字符

「\ u00a5123」

當打印字符串到控制檯,我得到的與輸出相同的字符串(如預期)。

但是,我想通過將unicode轉換爲實際的日元符號(\ u00a5 - >日元符號)來打印出來 - 我該如何去做這件事?

即所以它看起來是這樣的: 「[日元符號] 123」

+0

因此,爲了更好地瞭解問題空間,有沒有辦法得到一個合適的Unicode字符串?這是用什麼語境?時間/速度是一個重要的考慮因素? – aperkins 2009-09-10 01:12:08

+0

另外,有沒有簡化的假設?即這是「\ u ####」會發生的唯一時間嗎?因爲那麼你可以使用正則表達式來提取數字。 – aperkins 2009-09-10 01:14:08

+0

可能的重複[如何在Java中忽略Java字符串](http://stackoverflow.com/questions/3537706/howto-unescape-a-java-string-literal-in-java) – 2015-01-13 16:06:47

回答

15

我寫了一個小程序:

public static void main(String[] args) { 
    System.out.println("\u00a5123"); 
} 

它的輸出:

¥123

即它輸出完全符合你在帖子中陳述的內容。我不確定沒有其他事情在發生。你使用的是什麼版本的Java?

編輯:

爲了迴應您的澄清,有幾種不同的技術。最直接的方法是查找一個「\ u」後跟4個十六進制代碼字符,將其提取出來並用十六進制代碼替換爲unicode版本(使用Character類)。這當然假定字符串在它前面不會有\ u。

我不知道任何特定的系統來解析字符串,就好像它是一個編碼的Java字符串。

+0

你說的直接打印字符串會給你正確的輸出是正確的。但是,有人向我傳遞了一個本質上已逃脫的字符串。所以讓我們假設你的main方法仍然存在,但是你調用了一個名爲foo的方法,如下所示:foo(「\\ u00a5123」); < - 注意字符串的轉義 - 所以本質上我在foo方法裏面得到的參數是我正在處理的字符串 – digiarnie 2009-09-10 00:58:47

+0

反斜槓轉義是隻有Java編譯器需要處理的東西,而不是JVM或API。因此,發現在運行時解析這些字符串並不容易。 – 2009-09-10 01:44:49

+0

@Todd同意 - 關於我唯一能想到的其他事情是試圖以某種方式使用編譯器 - 但這對我來說聽起來很麻煩。 – aperkins 2009-09-10 01:58:51

1

你可能不得不爲這些寫一個解析,除非你可以在第三方庫中找到一個解析。 JDK沒有任何東西可以爲你解析這些信息,我知道,因爲我最近有一個想法是使用這種類型的轉義來作爲通過僅用Latin-1的數據庫來走私unicode的方式。 (我結束了做別的任何btw)

我會告訴你,當讀寫文件(因爲文件必須是ASCII)時,java.util.Properties以這種方式轉義和unescapes Unicode字符。它使用的方法是私有的,所以你不能調用它們,但是你可以使用JDK源代碼來激發你的解決方案。

+0

有點令人費解,但是您可以將字符串作爲值發送到內存中的屬性文件,然後使用「屬性」類讀取它。 – McDowell 2009-09-10 08:59:56

2

如前所述,這些字符串將不得不被解析以獲得所需的結果。

  1. 使用\ u作爲分隔符對字符串進行標記。例如:\u63A5\u53D7 => { "63A5", "53D7" }

  2. 處理這些字符串如下:

    String hex = "63A5"; 
    int intValue = Integer.parseInt(hex, 16); 
    System.out.println((char)intValue); 
    
0

可以與此替換上面的:

System.out.println((char)0x63A5); 

這裏是打印所有的框建築物的代碼unicode字符。

public static void printBox() 
{ 
    for (int i=0x2500;i<=0x257F;i++) 
    { 
     System.out.printf("0x%x : %c\n",i,(char)i); 
    } 
}