将转义的 UTF8 字符转换回其原始形式 [英] Converting escaped UTF8 characters back to their original form

查看:24
本文介绍了将转义的 UTF8 字符转换回其原始形式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从来自 plist 的数组中读取字符串并打印这些字符串.

I'm trying to read strings from an array that's coming from a plist and print those strings.

数组中的字符串包含转义的 UTF8 字符 - 例如,从 plist 读取时,Nuša Florjančič"变成了 Nuu0161a Florjanu010diu010d".没有办法改变plist的内容,但我的程序需要正确显示名称.

The strings in the array contain escaped UTF8 characters - for example "Nuša Florjančič" becomes "Nuu0161a Florjanu010diu010d" when read from the plist. There is no way to change the content of the plist, but my program needs to display the names properly.

奇怪的是,当我对字符串进行硬编码时,Objective-C 似乎会自动执行此操作.但是,如果我从 plist 中获取字符串,则什么也不会发生.

The strange thing is that Objective-C seems to do this automatically when I'm hardcoding the string. However, if I get the string from the plist nothing happens at all.

举个例子,下面是一些代码:

To give you an example, here's some code:

NSString *name1 = @"Nuu0161a Florjanu010diu010d";
NSString *name2 = [list objectAtIndex:0];       
NSLog(@"name 1: %@", name1);
NSLog(@"name 2: %@", name2);

[list objectAtIndex:0] 包含 @"Nuu0161a Florjanu010diu010d" - 唯一的区别是它是通过 plist 编辑器设置的.

[list objectAtIndex:0] contains @"Nuu0161a Florjanu010diu010d" - the only difference is that it has been set via the plist editor.

控制台输出为:

2011-10-22 18:00:02.595 Test[13410:11c03] name 1: Nuša Florjančič
2011-10-22 18:00:02.595 Test[13410:11c03] name 2: Nuu0161a Florjanu010diu010d

我尝试了各种方法,包括将字符串转换为 C 字符串,然后使用 UTF-8 编码创建一个 NSString 对象,但没有任何效果.

I've tried all sorts of things, including transforming the string into a C-string and then creating an NSString object with a UTF-8 encoding but nothing worked at all.

我非常感谢您提供任何可能帮助我解决这个看似平凡的问题的建议.

I'd really appreciate any pointers from you that might help me solve this seemingly mundane problem.

推荐答案

听起来 plist 中的字符串包含字符u0161"而不是 Unicode 字符编号 0x161.因此,您需要解码从 plist 中提取的字符串中的 u 转义符.NSString 可以使用 NSNonLossyASCIIStringEncoding 为您做到这一点:

It sounds like the string in the plist contains the characters "u0161" rather than the Unicode character number 0x161. So you need to decode the u escapes in the string you've extracted from the plist. NSString can do that for you using NSNonLossyASCIIStringEncoding:

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
    @autoreleasepool {
        NSString *name2escaped = @"Nu\u0161a Florjan\u010di\u010d";
        NSString *name2 = [NSString
            stringWithCString:[name2escaped cStringUsingEncoding:NSUTF8StringEncoding]
            encoding:NSNonLossyASCIIStringEncoding];
        NSLog(@"name2 = %@", name2);
    }
    return 0;
}

这篇关于将转义的 UTF8 字符转换回其原始形式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆