iOS转换十六进制值

6
如何将十六进制值转换为表情符号,我有一个如下所示的字符串。
NSString *myVal = @"1F61E";

我应该如何将这段文本转换为表情字符显示?

我从这个链接上找到了这个值。请告诉我,我真的被卡住了。

更新

NSString *utf8String1 = @"1F61E";
NSString *a = [self convert:utf8String1];
NSLog(@"%@ &&&&&&&&&&&&&&&&&&&&&",a);


-(NSString*)convert:(NSString*)decoded{

    unichar unicodeValue = (unichar) strtol([decoded UTF8String], NULL, 16);
    char buffer[2];
    int len = 1;

    if (unicodeValue > 127) {
        buffer[0] = (unicodeValue >> 8) & (1 << 8) - 1;
        buffer[1] = unicodeValue & (1 << 8) - 1; 
        len = 2;
    } else {
        buffer[0] = unicodeValue;
    }

    return [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];



}

请查看这个在SO上的答案,它确切地解释了这个问题:https://dev59.com/bHI-5IYBdhLWcg3wlpiW - Adrian Kosmaczewski
2个回答

4

你试图编码的代码点无法适应16位。因此,您需要使用UTF-32编码:

NSScanner *scan = [[NSScanner alloc] initWithString:@"1F61E"];
unsigned int val;
[scan scanHexInt:&val];
char cc[4];
cc[3] = (val >> 0) & 0xFF;
cc[2] = (val >> 8) & 0xFF;
cc[1] = (val >> 16) & 0xFF;
cc[0] = (val >> 24) & 0xFF;
NSString *s = [[NSString alloc]
    initWithBytes:cc
           length:4
         encoding:NSUTF32StringEncoding];
NSLog(@"[%@]", s);

感谢您的回复。请问我该如何将我的变量转换为这种格式:0x00、0x01、0cf6、0x1e?请告知。 - user198725878
非常感谢您的帮助,请问您能否解释一下它是如何工作的? - user198725878
@user198725878 当然可以!NSScanner将您的十六进制值转换为4字节无符号整数,四个>>& 0xFF操作“剪切”出单独的8位部分,形成一个4字节的char数组,最后使用NSUTF32StringEncoding标志从这四个字节构造字符串,该标志表示每个字符串字符都编码为四字节的UNICODE代码点。 - Sergey Kalinichenko

0

你的第一步是将它转换为它的数值:

unichar unicodeValue = (unichar) strtol([input UTF8String], NULL, 16);

然后,根据这个帖子的规则:

char buffer[2];
int len = 1;

if (unicodeValue > 127) {
    buffer[0] = (unicodeValue >> 8) & (1 << 8) - 1;
    buffer[1] = unicodeValue & (1 << 8) - 1; 
    len = 2;
} else {
    buffer[0] = unicodeValue;
}

return [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];

现在您已经拥有了UTF-8格式的字符串!


嗨,感谢回复。这个NSString的结果会是表情符号吗?还是我需要做些什么才能显示出来?请告诉我。 - user198725878
@user198725878 抱歉,我没有设备来测试这个,你需要自己尝试! - Richard J. Ross III
当我尝试使用NSLog打印返回的NSString值时,它只显示为"(null)",请告诉我原因。 - user198725878
当我尝试使用NSLog打印返回的NSString值时,它只显示为"(null)"。请告诉我原因。 - user198725878
@user198725878,你可以直接在字符串中使用 \u1F61E 作为 char 来追加吗?这比使用 strtol 的方法要简单得多。 - Richard J. Ross III
让我们在聊天中继续这个讨论 - Richard J. Ross III

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接