Отображение 5-значного базового символа Юникода из шрифта Entypo

#ios #objective-c #unicode

#iOS #objective-c #юникод

Вопрос:

Я использую шрифт Entypo в своем приложении для iPhone, но он работает нормально только для некоторых символов. Я не могу отображать значки, используя пятизначные значения Юникода.

Я нашел в Интернете некоторую информацию, в которой говорится, что это связано с кодировкой UTF, поддерживаемой iOS (и на других языках тоже), и 5-значные значения unicode должны быть разделены на два значения.

Но я не нашел четкого описания или примера кода.

Мой код для отображения символа Entypo выглядит примерно так:

 myLabel.text = [NSString stringWithUTF8String:"u25B6"];
myLabel.font = [UIFont fontWithName:@"Entypo" size:200];
  

Если я заменю значение юникода на » u1F342″, которое является листом значка в шрифте Entypo, тогда отображается недопустимый символ.

Если вы уже сталкивались с этой проблемой, возможно, вы могли бы помочь мне сэкономить время.

Большое спасибо

Ответ №1:

Если вы проверите страницу юникода для этого символа, вы увидите, что его кодировка UTF-8 0xF0 0x9F 0x8D 0x82 — это то, что вы должны использовать:

 myLabel.text = [NSString stringWithUTF8String:"uf0u9fu8du82"];
  

Примечание: полностью не проверено.

Комментарии:

1. Спасибо за вашу помощь. Я, наконец, нашел другой способ избежать поиска кодировки UTF-8 на другом веб-сайте.

Ответ №2:

После нескольких поисков я, наконец, нашел решение, которое легко использовать в разных случаях: символ, закодированный до 4 цифр и более 4 цифр.

Я определил категорию NSString следующим образом:

 #import "NSString Extension.h"

@implementation NSString (Extension)

/**
 * Convert a UTF8 symbol to a string which can directly be used as text in a label view for instance, for which the right font has been specified.
 *
 * The method can be used for both cases
 *  . the symbol is defined as a const char with a maximum of 4 digits. In this case the first parameter must be 0 and the second is used. Example: NSString *symbolString = [NSString symbolStringfromUnicode:0 orChar:"uE766"]
 *  . the symbol is defined as an integer with hexadecimal notation. It can be have either less or more than 4 digits. In this case, only the first parameter is used. Example : NSString *prefixSymbol = [NSString symbolStringfromUnicode:0x1F464 orChar:nil];
 *
 * @param symbolUnicode     symbol to convert defined as int
 * @param symbolChar        symbol to convert defined as const char *
 *
 */

  (NSString *)symbolStringfromUnicode:(int)symbolUnicode orChar:(const char *)symbolChar
{
    NSString *symbolString;
    if (symbolUnicode == 0) {
        symbolString = [NSString stringWithUTF8String:symbolChar];
    }
    else {
        int unicode = symbolUnicode;
        symbolString = [[NSString alloc] initWithBytes:amp;unicode length:sizeof(unicode) encoding:NSUTF32LittleEndianStringEncoding];
    }

    return symbolString;
}

@end