#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