2012-01-18 69 views
1

我明白爲什麼當從NSData到NSString你需要指定編碼。 但是我發現令人沮喪的是如何反向(NSString到NSData)需要來指定一個編碼。NSString NSData編碼考慮

在這種使用相關 NSUTF8StringEncodingdefaultCStringEncoding,後者沒有得到充分解釋question答案建議。

所以我只想問,如果轉換的NSString時的NSData以下是正確的:

  • 在你想成爲100%肯定的NSString對象的二進制表示UTF8然後使用情況NSUTF8StringEncoding(或任何編碼需要)

  • 在其中的NSString對象的編碼是已知的/預期已經是特定類型的情況下,不轉換是必需的,然後它的安全(或許內部更快)使用d efaultCStringEncoding(從我讀過的Objective-C採用UTF-16內部,不知道是否LE或BE但我認爲LE因爲平臺是LE)

TIA

回答

3

編碼需求將其指定用於將NSString轉換爲NSData,原因與需要指定從NSData到NSString的相同原因相同。

NSData對象是絕對原始字節的字符串的包裝。如果NSString沒有指定某種編碼,它不知道該寫什麼,因爲在1和0的級別上,UTF-16編碼看起來與同一個字母的UTF-8編碼不同,當然,如果您將UTF-16編寫爲big-endian並將其作爲little-endian閱讀,則會得到亂碼。

換句話說,不要認爲它是轉換或轉義字符串;它是產生一個字節緩衝區,並且編碼告訴它當下一個字符是「a」時要寫入哪些和零,以及當它意味着「媽」時寫入哪些字符和零。

至於你的問題......這是我的兩分錢。如果你正在將一個NSString轉換爲一個NSData,以便你的同一個程序可以稍後將它轉換回來,並且在你將它讀回NSString之前,沒有其他軟件需要處理這個NSData,那麼這些都不重要。重要的是你的字符串到數據編碼和你的數據到字符串編碼匹配。 2)如果你只處理ASCII字符,你可能會逃脫很多,只是因爲多種編碼對128以下的字符使用相同的表示方式。但是這很容易破壞,即使是像智能引號。

3)儘管名稱,defaultCStringEncoding不是你應該使用的默認值。它專爲需要處理系統字符串並且不知道系統如何處理其內部字符串的特殊情況而設計。它指的是在默認的C實現中處理字符串的方式,而不是在NSString內部進行處理,所以不一定有性能優勢。4)如果你編寫一個字符串時使用了未知的字符串編碼,並且你嘗試用不同的字符串編碼讀取它,那麼你的代碼將失敗;在很多情況下,你最終會得到一個空字符串。

底線是:誰會試圖解釋你的NSData對象?如果它是您自己的應用程序,請選擇一種對您有意義的編碼(我對所有內容都使用UTF8)並將其用於兩種轉換。否則,請確定您的生態系統需要讀取或寫入的內容,並制定您的標準。