2012-02-18 62 views
1

我在作爲響應HTTP Post的一部分而獲得的字符串中間出現空字符。因此,即使字符串中有更多數據,內容也只能打印到空字符。下面是說明問題的示例代碼由於字符串中間的空字符,NSString內容被截斷

NSString *testString= @"v1db1���������¿¿sssss"; ->this line shows the null character warning 
NSInteger stringlength = [testString length]; 
NSLog(@"String Length:%ld",stringlength); 
NSLog(@"String Value:%@",testString); 

注意:測試字符串包含帶問號的空字符。出於某種原因,我無法保存帖子,如果我複製確切的字符串。

第一行在Xcode中顯示警告「保留在字符串文字中的空字符」。

這個程序的輸出是

String Length:21 
String Value:v1db1 

什麼是解決這個問題的正確途徑?我正在考慮掃描NSString的空字符並刪除它。什麼可能是我得到空字符的原因?

+0

您如何在代碼中從HTTP Post響應中獲取NSString?這很可能是你的問題的根源,你不應該首先創建一個帶有null的NSString。 – CRD 2012-02-18 18:48:12

+0

@CRD謝謝。這個數據是由服務器返回的,並且null沒有插入。我使用HTTP頭中的內容類型來確定響應數據的編碼。如果有幫助,我使用** bold **(CFReadStreamCreateForHTTPRequest)作爲http請求。不知怎的,讀取的數據在兩者之間包含空字符。即使這是服務器中的問題,客戶端也需要處理它。我發現了一個線程,其中有一個類似的問題正在討論[link](http://www.cocoabuilder.com/archive/cocoa/174917-nul-characters-in-nsstring-cause-unexpected-results.html?q=NUL+串#174917)。 – Sriram 2012-02-19 07:09:25

+0

將您實際使用的代碼添加到您的問題中。他們很可能會將您讀取的字節轉換爲NSString是您問題的原因。直到人們看到您的實際代碼,他們幾乎沒有機會幫助您。您也可以查看以十六進制格式打印出實際讀取的字節,以查看來自服務器的內容。 – CRD 2012-02-21 09:50:50

回答

0

問題字符是UTF-8編碼的東西(EF BF BD和C2 BF),它們直接在XCode中的帶引號的字符串中處理得很差。您需要將其轉換。例如:

[ NSString stringWithUTF8String: [ @"v1db1���������¿¿sssss" cStringUsingEncoding: [ NSString defaultCStringEncoding ] ] ]; 
+0

原來,編碼的字符只是未知字符以UTF-8編碼的方式,您必須立即轉換字符以便有機會看到它們。當他們到達字符串文字時,他們已經失去了。 – colbadhombre 2012-02-18 16:14:28

+0

感謝您的快速回復。我已經嘗試過,但不起作用。由於某些原因,我無法複製確切的字符串。試想一下,如果testString就像testString =「一些文本+空字符+一些文本2」。我得到的輸出是一些文本。這是我第一次遇到這樣的問題 – Sriram 2012-02-18 17:37:16

+0

空字符是C字符串終止的方式。如果你說你的HTTP響應包含一個響應,那麼你必須查看服務器端來了解它發生的原因。如果您希望讓HTTP客戶端不要以爲該字符串在空字符處終止,那麼您必須自行打破該字符串,或將空字符替換爲其他字符。 – colbadhombre 2012-02-18 18:30:03