【问题标题】:Substring char * in Objective CObjective C中的子字符串char *
【发布时间】:2017-09-07 06:34:38
【问题描述】:

我需要将char* 子串化到一定长度,并且需要转换为NSString

char *val子串长度

我试过了

NSString *tempString = [NSString stringWithCString:val encoding:NSAsciiStringEncoding];
NSRange range = NSMakeRange (0, length);
NSString *finalValue = [tempString substringWithRange: range];

这适用,但不适用于其他特殊字符语言,如中文。 如果我转换为 UTF8Encoding 那么子字符串长度将不匹配。

有没有其他方法可以将char* 子串化为UTF8 编码?

【问题讨论】:

  • 你检查过 MD5 吗?我不确定
  • 为什么是 MD5?我只需要将 char* 转换为 UTF8 字符串。在转换之前我需要做子字符串。
  • 参考此链接可能会有所帮助。 stackoverflow.com/questions/46085704/…
  • @DixitAkabari 为什么会这样?

标签: ios objective-c substring


【解决方案1】:

你必须使用编码,字符串被编码。

在您的情况下,您说将字符串解释为 ASCII 字符串。 ASCII does not have chinese characters. 因此这不适用于汉字:它们不存在。

您可能有一个 UTF8 编码的字符串。但简单地切换到 UTF8 并没有帮助。由于NSString 和 OS X/iOS 都编码 16 位 Unicode,但扩展 Unicode 有 20 位,汉字需要多个代码。这有一些影响,例如-length 返回的是代码的数量,而不是汉字的数量。但是,您可以使用-rangeOfComposedCharacterSequencesForRange: 调整范围。

例如?(中日韩统一表意文字-0x20016):

NSString *str = @"?";                            // One chinese whatever
NSLog(@"%ld", [str length]);                      // This are "2" characters

NSRange range = {0, 1};                           // Range for the "first" character
NSLog(@"%ld %ld", range.location, range.length);  // 0 1
range = [str rangeOfComposedCharacterSequencesForRange:range];
NSLog(@"%ld %ld", range.location, range.length);  // 0 2

如果您添加有关输入字符串的编码和输出所需编码的信息,您可以获得更好的答案。

字符串不是 UTF8 或任何字符串。字符串是字符串。它们的存储,它们在计算机内存中的表示编码,但它们自己没有编码。

【讨论】:

  • 所以我可以使用 UTF8 和带有 rangeOfComposedCharacterSequencesForRange 的子字符串?
  • 输入不是 NSString,它的 char *char* 具有每个 uni 字符,我需要将其子串化并转换为 NSString
  • char * 不能有“每个 unicode 字符”,因为 char 是 8 位。这还远远不够。如果是 UTF8,请使用 UTF8。如果是真正的 20 位编码(使用 3 或 4 个字节,分别为 chars),则使用相应的编码常量。但首先:获取有关您获得的编码的信息。 (不是您程序中的类型。)并且总是使用-rangeOfComposedCharacterSequencesForRange: 来调整范围。
【解决方案2】:

我找到了问题的解决方案

char subString[length+1]; 
strncpy(subString, val, length);
subString[length] = '\0'; // place the null terminator
NSString *finalString = [NSString stringWithCString: subString encoding:NSUTF8StringEncoding];

我做了 char* 子字符串和 UTF8 编码。

【讨论】:

  • 投反对票有什么理由吗?
猜你喜欢
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
相关资源
最近更新 更多