修剪过的字符串只会改变一半的长度

时间:2014-01-30 16:55:09

标签: objective-c nsstring trim objective-c++ string-length

请有人给一些建议。 在我的iOS应用程序中,我正在解析XML(在第三方库的帮助下),并且在字符串的开头/结尾处有额外的空格/ newLines问题。返回此第三方库的初始字符串,它是我转换为std::wstring的C ++ NSString(编码应正确,因为新NSString的内容等于正确的部分我的XML文件)。在“空”元素(仅包含空格和新行)的修剪长度之后,不会变为零,而是将其值改为一半。 代码如下......

std::wstring val;
NSString *initial = [[NSString alloc] initWithBytes:val.data() length:sizeof (wchar_t)*val.size() encoding:NSUTF16LittleEndianStringEncoding];
NSString *trimmed = [initial stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

如果尝试像NSLog(@"bybyby'%@'bebebe", trimmed);那样输出bebebe从未显示过。看起来有一些新行,无法检测到的空格。

1 个答案:

答案 0 :(得分:2)

wchar_t是一个32位整数(在iOS和OS X上),因此您必须使用NSUTF32LittleEndianStringEncoding转换为NSString

示例:

std::wstring val (L"   Hello World   ");
NSString *initial = [[NSString alloc] initWithBytes:val.data() length:sizeof (wchar_t)*val.size() encoding:NSUTF32LittleEndianStringEncoding];
NSString *trimmed = [initial stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"'%@'", trimmed);
// Output: 'Hello World'

您的情况可能发生了什么(NSUTF16LittleEndianStringEncoding) 是initial字符串中的每个第二个字符都是NUL字符, 它在印刷时充当终结者。