【问题标题】:NSString contents get truncated because of the null character in the middle of the string由于字符串中间的空字符,NSString 内容被截断
【发布时间】:2012-02-19 01:43:23
【问题描述】:

作为对 HTTP Post 的响应的一部分,我在字符串的中间得到了空字符。结果,即使字符串中有更多数据,内容也只会打印到空字符。下面是说明问题的示例代码

 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 中显示警告“Null character(s) reserved in string literal”。

这个程序的输出是

 String Length:21
 String Value:v1db1

解决此问题的正确方法是什么?我正在考虑扫描 NSString 以查找任何空字符并将其删除。我得到空字符的原因可能是什么?

【问题讨论】:

  • 如何在代码中从 HTTP Post 响应中获取 NSString?这很可能是你的问题的根源,你不应该首先创建一个带有 null 的 NSString。
  • @CRD 谢谢。此数据由服务器返回,未插入 null。我使用 HTTP 标头中的内容类型来确定响应数据的编码。如果有帮助,我将 **bold**(CFReadStreamCreateForHTTPRequest) 用于 http 请求。不知何故,读取的数据在两者之间包含空字符。即使是服务器的问题,也希望客户端处理它。我发现一个线程正在讨论类似的问题link
  • 将您实际使用的代码添加到您的问题中。很有可能他们将读取的字节转换为 NSString 的方式是导致问题的原因。在人们看到您的实际代码之前,他们几乎没有机会帮助您。您还可以查看以十六进制打印实际读取的字节,以查看来自服务器的内容。

标签: objective-c xcode cocoa


【解决方案1】:

问题字符是 UTF-8 编码的东西(EF BF BD 和 C2 BF),这些字符在 XCode 中的引用字符串中直接处理不当。您将需要对其进行转换。比如:

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

【讨论】:

  • 原来编码的字符只是未知字符在 UTF-8 中编码的方式,你必须立即转换字符才有机会看到它们。当他们到达字符串文字时,他们已经迷路了。
  • 感谢您的快速回复。我已经尝试过了,但不起作用。由于某种原因,我无法复制确切的字符串。想象一下,如果 testString 类似于 testString = "Some text + null character + some text 2"。我得到的输出是一些文本。这是我第一次遇到这样的事情
  • 空字符是 C 字符串的终止方式。如果您说您的 HTTP 响应包含一个,那么您必须查看服务器端以找出它发生的原因。如果你想让你的 HTTP 客户端不认为字符串在 null 字符处终止,那么你必须自己打破它,或者用其他东西替换 null。
  • 谢谢。从服务器查看不是一种选择。该代码是复杂身份验证逻辑的一部分,服务器是高度动态的。我只在一个特定场景中的一台特定服务器上发现这个问题。除非我找到更好的东西,否则替换空字符将是最后的手段。
猜你喜欢
  • 1970-01-01
  • 2014-12-04
  • 2011-06-05
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多