Resolva o problema de caracteres chineses "ilegíveis" (codificação Unicode) gerados pelo iOS NSDictionary

Basta definir um dicionário e gerar o resultado:

NSDictionary *dic = @{
                      @"我是中文字符": @"223333",
                      @"aaa": @{
                                @"aaa": @"啦啦啦"
                              }
                      };
NSLog(@"%@", dic);

Você verá esse "código distorcido", que é frequentemente encontrado ao depurar o servidor para retornar resultados JSON:

-02-25 19:23:40.346 XXXX[13273:417921] {
    
    
    aaa =     {
    
    
        aaa = "\U5566\U5566\U5566";
    };
    "\U6211\U662f\U4e2d\U6587\U5b57\U7b26" = 223333;
}

Na verdade, este é o método de representação da codificação Unicode. A propósito, vamos entender brevemente a codificação Unicode:

    \uxxxx这种格式是Unicode写法,表示一个字符,其中xxxx表示一个16进制数字,范围所0~65535. Unicode十六进制数只能包含数字0~9、大写字母A~F或者小写字母A~F。需要注意到是:Unicode的大小端问题,一般都是小端在前,例如 \u5c0f 表示汉语中的 ‘小’字,转换成10进制就是9215,所以在byte数组中应该是1592. (引自\u Unicode和汉字转化)

A solução é recodificar a string de saída. Para se livrar dele de uma vez por todas, você pode usar diretamente o método swizzing para substituir a função original. Veja como fazer isso:

Arquivo de definição NSDictionary+Unicode.m

@implementation NSDictionary (Unicode)

- (NSString*)my_description {
    NSString *desc = [self my_description];
    desc = [NSString stringWithCString:[desc cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding];
    return desc;
}

@end

Primeiro, importe a biblioteca JRSwizzle para o projeto, adicione código no método didFinishLaunchingWithOptions de AppDelegate.m e substitua o método de descrição original:

[NSDictionary jr_swizzleMethod:@selector(description) withMethod:@selector(my_description) error:nil];

Depois de concluir a substituição, use a saída do comando po durante a depuração para ver a saída em chinês:

(lldb) po dic
{
    aaa =     {
        aaa = "啦啦啦";
    };
    "我是中文字符" = 223333;
}

Problemas restantes:
Usar NSLog(@”%@”, dic); diretamente ainda exibirá caracteres ilegíveis e o motivo não está claro. Uma solução temporária é usar NSLog(@”%@”, [dic description]);.

Acho que você gosta

Origin blog.csdn.net/baidu_33298752/article/details/51647326
Recomendado
Clasificación