2014-10-17 71 views
0

我正在做一些密碼分析作業,並試圖編寫代碼,做a + b = c。我的想法是使用unicode。 b +(b-a)= c。問題是我的代碼返回c的unicode值而不是String「c」,我無法將其轉換。將字符串「 u0063」的字符串轉換爲「c」

請有人可以解釋一下名爲unicode的字符串與那些名爲test和test2的區別嗎?還有什麼辦法可以讓字符串unicodeOfC打印「C」?

//this calculates the unicode value for c 
String unicodeOfC = ("\\u" + Integer.toHexString('b'+('b'-'a') | 0x10000).substring(1)); 

//this prints \u0063 
System.out.println(unicodeOfC); 

String test = "\u0063"; 

//this prints c 
System.out.println(test); 

//this is false 
System.out.println(test.equals(unicodeOfC)); 

String test2 = "\u0063"; 
//this is true 
System.out.println(test.equals(test2)); 

回答

1

testtest2之間沒有區別。它們都是Stringliterals指的是相同的String。這String文字由unicode escape組成。

一種Java編程語言(「Java編譯器」)第一 識別的Unicode在其輸入中逃逸,平移ASCII 字符\u編譯器接着四個十六進制數字的UTF-16碼 單元(§ 3.1)爲指定的十六進制值,並且所有其他 字符不變。

所以編譯器會轉換這個Unicode轉義並將其轉換爲相應的UTF-16代碼單元。也就是說,unicode轉義\u0063轉換爲字符c

在這種

String unicodeOfC = ("\\u" + Integer.toHexString('b'+('b'-'a') | 0x10000).substring(1)); 

String的字面"\\u"(其利用了\字符逃脫\字符)具有\u運行時的值,即兩個字符\u。該String與調用toHexString(..)的結果連接。然後您對String調用substring,並將其結果指定爲unicodeOfC。所以String的值是\u0063,即。 6個字符\,u, 0, 0,63

也有什麼辦法可以讓字符串unicodeOfC打印「c」?

同樣你如何創建它,你需要得到Unicode轉義的數字部分,

String numerical = unicodeOfC.replace("\\u", ""); 
int val = Integer.parseInt(numerical, 16); 
System.out.println((char) val); 

然後你可以把它打印出來。

+0

非常好,我理解你的答案,並感謝額外的代碼,它的工作原理是如何工作的。非常感謝您的幫助。 – math125 2014-10-17 01:47:34

0

我想你不理解字符串轉義的工作原理。

在Java中,反斜槓是一個轉義字符,它允許您在字符串中使用字符,如換行\n,標籤\t或unicode \u0063

假設我正在寫代碼,我需要打印換行符。我會做這個System.out.println("\n");

現在可以說,我想展現一個反斜槓,System.out.println("\");將是一個編譯錯誤,但System.out.println("\\");將打印\

因此,您的第一個字符串是打印字面反斜槓字符,然後字母u然後是十六進制數字。

+0

謝謝!我知道\ n等等,所以當你這樣說的時候它是有道理的。 – math125 2014-10-17 01:48:46