2011-06-20 43 views
2

歡呼聲,如果字符串不需要漂亮,應使用哪種編碼將NSData轉換爲NSString並向後轉換?

我的應用程序需要將一個NSData對象的內容作爲GET請求的參數發送到Web服務器。它應該能夠在以後收到相同的數據。數據將作爲長文本存儲在mysql數據庫中,內容不爲我所知,可能幾乎任何東西。

要做到這一點,我需要把它轉換成一個的NSString,但我應該選擇哪種編碼?只要雙方都一樣,我選擇哪一個都重要?

謝謝!

回答

3

如果確實需要將數據轉換爲字符串,使用Unicode編碼,爲Unicode爲每一個可能的字符代碼點。最常見的Unicode編碼是明顯UTF-8NSUTF8StringEncoding

但如果這是你需要傳送任意數據,以及這些數據並不代表一個字符串,不要將它轉換成一個字符串,無論編碼爲。這將導致問題

相反(例如,如果你的數據有一個零字節,它會被視爲一個字符串結束,等等),如果你需要一些原始數據傳輸到服務器,可以考慮:

  • 使用POST而不是GET如果可能的話
  • 進行編碼爲Base64您的數據,這樣就確保從客戶的運輸過程中轉換,也不到你的服務器的時候,你不會丟失任何數據(或者更糟,破壞你的數據通過轉換爲任意編碼)
  • 如果可能的話你R服務器(如果它是你的,你可以訪問代碼),您的解碼Base64編碼的字符串返回到在接收的原始數據,並儲存於BLOB字段,而不是在VARCHAR或BIGTEXT場。
  • 如果您不能訪問服務器代碼,並有一個TEXT/VARCHAR字段將它存儲在你的數據庫中沒有選擇,你還可以直接存儲在數據庫中代表您的數據的Base64編碼的字符串(和對其進行解碼當你從數據庫中檢索它時)。

在Objective-C中查看Google for Base64編碼,有很多對廣泛使用的NSString + Base64類別的引用。

0

只要你使用相同種類的編碼,你應該是好的。對於大多數目的而言,UTF-8是很好的。 NSUTF8StringEncoding

1

您應該使用Base -64編碼此。看到這個答案的詳細信息/代碼:

How do I do base64 encoding on iphone-sdk?

的GET請求的參數應該是字符串,並且在理想的(兼容大多數)世界他們完全逃脫了7位ASCII。採取任意數據並將其編碼爲傳統的Unicode字符串編碼之一,以便將其放入URL中將導致各種痛苦和神祕錯誤。

BASE-64被設計成用於數據< =>串編碼。 (與字符串< =>字符串編碼。)

+0

謝謝,quixoto!我會和AliSoftware的回答一起去,因爲他的速度更快,並有一個很好的解釋。 +1提供的鏈接和額外的見解! – Toastor