在我的Java應用程序,我已經在一個字符串被通過,看起來像這樣:打印字符串字面Unicode作爲實際字符
「\ u00a5123」
當打印字符串到控制檯,我得到的與輸出相同的字符串(如預期)。
但是,我想通過將unicode轉換爲實際的日元符號(\ u00a5 - >日元符號)來打印出來 - 我該如何去做這件事?
即所以它看起來是這樣的: 「[日元符號] 123」
在我的Java應用程序,我已經在一個字符串被通過,看起來像這樣:打印字符串字面Unicode作爲實際字符
「\ u00a5123」
當打印字符串到控制檯,我得到的與輸出相同的字符串(如預期)。
但是,我想通過將unicode轉換爲實際的日元符號(\ u00a5 - >日元符號)來打印出來 - 我該如何去做這件事?
即所以它看起來是這樣的: 「[日元符號] 123」
我寫了一個小程序:
public static void main(String[] args) {
System.out.println("\u00a5123");
}
它的輸出:
¥123
即它輸出完全符合你在帖子中陳述的內容。我不確定沒有其他事情在發生。你使用的是什麼版本的Java?
編輯:
爲了迴應您的澄清,有幾種不同的技術。最直接的方法是查找一個「\ u」後跟4個十六進制代碼字符,將其提取出來並用十六進制代碼替換爲unicode版本(使用Character類)。這當然假定字符串在它前面不會有\ u。
我不知道任何特定的系統來解析字符串,就好像它是一個編碼的Java字符串。
你說的直接打印字符串會給你正確的輸出是正確的。但是,有人向我傳遞了一個本質上已逃脫的字符串。所以讓我們假設你的main方法仍然存在,但是你調用了一個名爲foo的方法,如下所示:foo(「\\ u00a5123」); < - 注意字符串的轉義 - 所以本質上我在foo方法裏面得到的參數是我正在處理的字符串 – digiarnie 2009-09-10 00:58:47
反斜槓轉義是隻有Java編譯器需要處理的東西,而不是JVM或API。因此,發現在運行時解析這些字符串並不容易。 – 2009-09-10 01:44:49
@Todd同意 - 關於我唯一能想到的其他事情是試圖以某種方式使用編譯器 - 但這對我來說聽起來很麻煩。 – aperkins 2009-09-10 01:58:51
你可能不得不爲這些寫一個解析,除非你可以在第三方庫中找到一個解析。 JDK沒有任何東西可以爲你解析這些信息,我知道,因爲我最近有一個想法是使用這種類型的轉義來作爲通過僅用Latin-1的數據庫來走私unicode的方式。 (我結束了做別的任何btw)
我會告訴你,當讀寫文件(因爲文件必須是ASCII)時,java.util.Properties以這種方式轉義和unescapes Unicode字符。它使用的方法是私有的,所以你不能調用它們,但是你可以使用JDK源代碼來激發你的解決方案。
有點令人費解,但是您可以將字符串作爲值發送到內存中的屬性文件,然後使用「屬性」類讀取它。 – McDowell 2009-09-10 08:59:56
如前所述,這些字符串將不得不被解析以獲得所需的結果。
使用\ u作爲分隔符對字符串進行標記。例如:\u63A5\u53D7 => { "63A5", "53D7" }
處理這些字符串如下:
String hex = "63A5";
int intValue = Integer.parseInt(hex, 16);
System.out.println((char)intValue);
可以與此替換上面的:
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);
}
}
因此,爲了更好地瞭解問題空間,有沒有辦法得到一個合適的Unicode字符串?這是用什麼語境?時間/速度是一個重要的考慮因素? – aperkins 2009-09-10 01:12:08
另外,有沒有簡化的假設?即這是「\ u ####」會發生的唯一時間嗎?因爲那麼你可以使用正則表達式來提取數字。 – aperkins 2009-09-10 01:14:08
可能的重複[如何在Java中忽略Java字符串](http://stackoverflow.com/questions/3537706/howto-unescape-a-java-string-literal-in-java) – 2015-01-13 16:06:47