【问题标题】:UTF8 Decoding with NSString使用 NSString 进行 UTF8 解码
【发布时间】:2026-01-24 12:00:01
【问题描述】:

我是 Objective-C 的新手,并尝试使用 apples docs 上的示例将格式错误的 UTF8 编码的 NSString 转换为格式正确的字符串。

NSString *theString = @"Lügen"; //should be "ü"
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];

NSLog(@"Original: %@ (length %d)", theString, [theString length]);  
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]);

结果:

Original: Lügen (length 6)
Converted: LA1/4gen (length 8)

这里什么都不做:

NSString* str = [NSString stringWithUTF8String:
                 [theString cStringUsingEncoding:NSASCIIStringEncoding]];

这会导致我的应用崩溃

NSString* str = [NSString stringWithUTF8String:
                 [theString cStringUsingEncoding:NSUTF8StringEncoding]];

有人知道我做错了什么吗?

【问题讨论】:

  • 你能将字符串转储为十六进制吗?我不能流利地阅读格式错误的 UTF8 :)
  • 这是一个 "ü" 不知道如何获取十六进制值 ;)
  • 请在任何涉及崩溃的问题中发布崩溃的详细信息。
  • @Jano:您应该将其添加为答案。

标签: objective-c ios utf-8


【解决方案1】:
NSString *string = @"ü";
const char *c = [string cStringUsingEncoding:NSISOLatin1StringEncoding];
NSString *newString = [[NSString alloc]initWithCString:c encoding:NSUTF8StringEncoding];
NSLog(@"%@",newString); // ü

“格式错误的 UTF-8 序列”是指在 UTF-8 中无效的字节序列。您的问题是在解析与字符串的原始作者使用的编码不同的字符串后出现意外结果。

十六进制数据C3 BC解析 UTF-8 编码为字符ü。相反,您使用了 Latin-1 编码,结果为 ü。然后,您从已解析的 Latin-1 字符串创建了一个 NSString,这意味着您将 Latin-1 字符串转换为 UTF-16 字符串(这是 NSString 的本机格式)。

以不同编码表示给定数据会显示为不同的字符,但不会更改数据。转换为不同的编码确实会更改数据以尝试重现相同的字符。示例:字符 ü 在 UTF-8 中是 C3 83 C2 BC,但在 Latin-1 中是 C3 BC。所以我转换为Latin-1中相同的字符来获取原始数据,然后我解析为UTF-8。

【讨论】: