2012-03-13 181 views
1

我有一個需求,我必須在輸出流上寫入一些文本,並使用輸入流將文本讀回其他地方。字節到字符串| Java

現在編寫輸出我使用string.getByte()將其轉換爲字節數組。現在讀取時,字符串使用構造函數String(byte [])形成。

話雖如此,這裏的問題是,閱讀字符串是不是我希望看到的。儘管所有的字母數字字符都是按原樣讀取的,但對於寫入的字符串中的其他特殊字符,其ASCII值將在打印符號前加上%符號。

即使像的字符串轉換爲字節數組,然後重構該字符串,像這樣

private stringToByte(){ 
     String data="\"X=Y;Z=A;B=C;\"" 
     byte[] byteArray=data.getByte(); 
     String readData=new String(byteArray); 
     System.out.println("data:"+readData); 
    } 

最平凡的是產生相同的結果。 現在,這是越來越在此之後產生的字符串看起來像

data:%22X=Y%3BZ=A%3BB=C%3B%22 

現在我的初步設想是,編碼系統正在使用默認字符集完成的,所以它應該被編碼。但即使在同一臺JVM中的同一臺機器上,這種行爲也很明顯。

我試着打外出時,通過使用

String readData=new String(byteArray,"diffent character set name"); 

但是,因爲它應該有線索的方式,它使情況更加惡化,因爲我是隨機嘗試不同的字符集名稱。

希望你能用它剎住我的惡作劇。你能指出我在這個方案中要去哪裏愚蠢嗎?

許多許多在此先感謝! :)

回答

1

當我在我的機器上測試它時,您的示例代碼(忽略拼寫錯誤)正常工作。此外,特殊字符%XX的概念表明還有更多的事情比你描述的更多,這看起來更像Percent Encoding。這看起來不像它由String.getBytes()造成的。

更可能與您通話的服務器使用百分比編碼,但無法對其進行解碼。

+0

非常感謝Durandal!絕對有很多事情在發生,我幾乎失明瞭,看不到他們!字符串使用URLEncoder.encode(data)進行編碼,我所要做的就是使用URLDecoder.decode(data)來取回我的原始數據。 – mawia 2012-03-14 13:21:41

4

像這樣使用Charset.forName(...)。您還可以查詢下面的示例中的可用字符集。

String data = "\"X=Y;Z=A;B=C;\""; 
byte[] byteArray = data.getBytes(Charset.forName("ISO-8859-1")); 
String readData = new String(byteArray, Charset.forName("ISO-8859-1")); 
System.out.println("data:" + readData); 

for (String name : Charset.availableCharsets().keySet()) { 
    System.out.println(name); 
} 
+0

嘗試過這一點,但不幸的是結果相同。此外,我不能更改編碼,因爲我們將此發送給第三方服務器,該服務器相當成功地完成了它的工作。我需要解碼正在編寫的測試實用程序,以測試發送到該服務器的數據,然後才能將其發佈。所以你可以理解,我的創造力是有限的閱讀數據,並不能改變編寫代碼。 – mawia 2012-03-13 15:26:00

3

你的例子在我的機器上工作(糾正一些錯別字,比如缺少;而getBytes而不是getByte)。您是否試圖用類似的方式強制編碼:

byte[] byteArray=data.getBytes(Charset.forName("UTF-8")); 
String readData=new String(byteArray, Charset.forName("UTF-8"));