2017-04-10 205 views
1

我想從NSString獲得一個cString。
所以我們使用c String使用Encoding:方法。
但是,不能保證c String Using Encoding:方法的返回值。
(Apple的文檔:返回的C字符串保證僅在接收器被釋放前纔有效。)

所以Apple建議使用get CString:max Length:encoding:方法。
我想將確切長度傳遞給maxLength。
以字節爲單位獲取UTF-8字符串長度的最佳方法?

實施例1)

NSString *tmp = @"中日韓" // cString 9bytes 
char *buffer = new tmp[9 + 1]; 
[tmp getCString:buffer maxLength:9+1 encoding:NSUTF8String​Encoding]; 

實施例2)

NSString *tmp = @"中日韓123" // cString 12bytes 
char *buffer = new tmp[12 + 1]; 
[tmp getCString:buffer maxLength:12+1 encoding:NSUTF8String​Encoding]; 

有沒有辦法知道的9和12在上面的例子中的長度?

+0

您的代碼是無效的,並不會編譯。你的意思是'NSString * tmp = @「你的字符串」;'或者你的意思是'char * tmp =「你的字符串」;'? – rmaddy

+0

@rmaddy對不起,我的錯。我編輯它。 – user3569109

+4

爲什麼標記爲C++?你只有Objective-C代碼。 – rmaddy

回答

4
// Add one because this doesn't include the NULL 
NSUInteger maxLength = [string maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; 
+1

lengthOfBytesUsingEncoding:更精確 - 它會得到字符串的實際長度(當然,您仍然需要爲NULL添加1)。 maximumLength快速返回,但會超過NSUTF8StringEncoding所需的長度。 –

3

您可以使用cStringUsingEncoding來獲得長度。如果你需要得到的char *壽命比tmp,然後簡單地複製C-字符串:

NSString *tmp = @"中日韓" // cString 9bytes 
const char *cStr = [tmp cStringUsingEncoding:NSUTF8StringEncoding]; 
size_t len = strlen(cStr); 
char *buffer = new tmp[len + 1]; 
strcpy(buffer, cStr);