来自后端的字符串应包含表情符号,但呈现为重音字母

String from backend should contain emoji but is rendered as accented letters

我在从 PHP 后端接收字符串到我的 iOS 应用程序时遇到问题。我收到的字符串如下所示:

Test ððððð

那些特殊字符应该是笑脸。现在我在这里检查了这个编码器: https://encoder.mattiasgeniar.be/index.php 并且该字符串是 UTF-8 编码的,确实是带有笑脸的字符串。

Test

现在我想知道源字符串是什么编码?以及如何将其转换为在 iOS 上正确显示的 UTF-8 字符串?

我试过了

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:@"Test ððððð" options:0];
NSString *message = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];

NSString *message = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)@"Test ððððð", CFSTR(""), kCFStringEncodingUTF8);

还有

NSString *message = [@"Test ððððð" stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

但其中 none 有效。我有点困惑源字符串的编码方式。

您的 Foundation 应用程序可能没有任何问题(顺便说一下,它非常非常好地原生支持 UTF-8 和 UTF-16)。


回答你的最后一个问题:

I'm kind of baffled what the source string is encoded like.

如果您打开该字符串并以字节为单位查看它,您会注意到 eth 字符('ð' [冰岛语和法罗语使用此字符])是 UTF-8 代码点 0xf0.

0xf0 也是 UTF-8 代理项序列的开始,用于开始对上面的 Emoji 字符 '' 进行编码(0xf0、0x9f、0x98、0x80)。表情符号的其余 3 个字节丢失。

[TL;DR]

您后端的某些东西,也许 PHP 本身,对 Unicode 的支持不是很好。