【问题标题】:Objective-C unicode to utf8Objective-C unicode 到 utf8
【发布时间】:2014-01-16 14:34:58
【问题描述】:

我在objective-c 中有一个带有unicode 编码的NSString,我想将它转换为UTF8。 看起来很简单,但我找不到简单的方法来做到这一点,而且网上也没有太多信息。

基本上我使用 FRE 将对象发送到 AS3,但我遇到了编码问题。该问题与未出现在 AS3 端的特殊字符有关。

编辑:

这是我的主要问题,我在 NSString Stanisław 中有这个名字。这是 NSString 中扩展方法的结果:

NSLog(@"%@, %d, %s", self, [self length], [self UTF8String]);

//Result: Stanisław, 9, Stanis≈Çaw

所以当我将 UTF8String 移动到 AS3 时,我得到了一个不同的名称(基本上结果是 Stanisła(没有最后一个字母)

我用来将字符串转换为 FRE 对象的方法是:

uint32_t st = FRENewObjectFromUTF8([self length], (const uint8_t *)[self UTF8String], &rv);

【问题讨论】:

  • utf8 是 a unicode 编码,还有 utf16 和 utf32。你有哪个原版>
  • 哦,谢谢,我不确定,但我会检查我在每一侧使用哪个(obj-c 和 AS3)
  • 不清楚你想要什么,请尽可能提供更多使用信息和代码。
  • 我添加了一些cmets和代码

标签: objective-c unicode encoding utf-8 air-native-extension


【解决方案1】:

中的问题

uint32_t st = FRENewObjectFromUTF8([self length], (const uint8_t *)[self UTF8String], &rv);

[self length] 是字符串中的 Unicode 字符数,而不是 [self UTF8String] 中的 UTF-8 字节数。

在您的情况下,"Stanisław" 具有 9 个 Unicode 字符,这些字符被转换为 10 UTF-8 字节。 您的代码将只发送前 9 个字节,这是您的“缩短” 观察到。

因此你应该用

替换你的代码
const char *utf8 = [self UTF8String];
uint32_t st = FRENewObjectFromUTF8(strlen(utf8), (const uint8_t *)utf8, &rv);

【讨论】:

  • 是的,我做到了,现在工作正常。感谢您的帮助。
【解决方案2】:

您可以通过向其发送-UTF8String 消息来获取任何 NSString 的 UTF8 表示形式。

【讨论】:

  • 这可能不是一个好主意,注意很可能需要的是数据表示,例如dataUsingEncoding:。特别是 UTF8String 状态的文档:“如果需要将 C 字符串存储在调用此方法的内存上下文之外,则应复制它”。寿命没有保证。
  • 爱你的个人资料标签:“可用于您的项目,但代价高昂且不便!”,我可能会偷走它!
  • 我添加了一些 cmets 和代码,可能可以澄清我的主要问题
【解决方案3】:

如果你有NSString,你可以这样做

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

或者,如果您需要const char *(这不太可能),您可以使用:

const char *anotherString = [string UTF8String];

现在,如果此 NSString 是您最初以 NSData 的形式从服务器检索的内容,您可以将其从您从网络请求中获得的 NSData 转换为类似以下内容的字符串:

NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

不过,在这种情况下,您必须确认服务器使用“unicode 编码”这一事实是什么意思。这是模棱两可的,您必须确认它是 UTF8(我在上面使用的)还是 UTF16(如果是 UTF16,是哪一个,例如 NSUTF16StringEncodingNSUTF16LittleEndianStringEncoding 或 ...)或其他什么。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2011-06-22
    • 2011-12-15
    • 2011-06-09
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多