У меня есть UILabel, на котором неправильно отображаются смайлы.

Вот скриншот из приложения для iOS: введите описание изображения здесь

А вот скриншот из приложения для Android, на котором правильно отображается тот же текст с эмодзи. введите описание изображения здесь

Я пробовал ответы на здесь, но они не помогли.

Пример строки: "تم البيع والله يبارك للمشتري♥️"

Вот код:

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:comment.body];
UIFont *cellFont = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];

NSDictionary *attributesDictionary;
NSMutableParagraphStyle *paragraphStyle =
[[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 10;
paragraphStyle.alignment = NSTextAlignmentRight;
paragraphStyle.allowsDefaultTighteningForTruncation = true;

attributesDictionary = @{
                         NSParagraphStyleAttributeName : paragraphStyle,
                         NSFontAttributeName : cellFont,
                         NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                         NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)
                         };

[str addAttributes:attributesDictionary
             range:NSMakeRange(0, str.length)];

cell.commentTextLabel.attributedText = str;

Любая помощь была бы признательна.

0
Abdullah Umer 13 Окт 2019 в 17:07
Я вижу ♥️, это нормальный "стандарт HTML"? Потому что я бы сказал, что для этого нужен специальный синтаксический анализ (например: [... replaceOccurencesOf:@"&hearts" with: @"HeartEmoji"];️). И NSDocumentTypeDocumentAttribute и NSCharacterEncodingDocumentAttribute не нужны в вашем коде. Компилятор пропускает их.
 – 
Larme
14 Окт 2019 в 12:24
Я забыл упомянуть, что исходный ответ находится в UTF-8. Примерно так: pastebin.com/raw/gf3vjXtu
 – 
Abdullah Umer
14 Окт 2019 в 12:46
И если для этого требуется синтаксический анализ "HeartEmoji", то почему он отлично отображается в android и в Интернете без синтаксического анализа. Будет непросто написать что-то подобное для всех смайликов. Должен быть какой-то другой способ.
 – 
Abdullah Umer
14 Окт 2019 в 12:47
Потому что iOS и Android используют разные стандартные библиотеки? Я не знаю, анализируется ли ♥ как таковой в iOS и даже в iOS lib. И это «особый» смайлик, на самом деле не смайлик. И снова NSDocumentTypeDocumentAttribute не работает в вашем коде, это не так. Я думаю, вам может потребоваться смешать stackoverflow.com/questions/23670959/… & stackoverflow.com/questions/25607247/…
 – 
Larme
14 Окт 2019 в 13:01
Я сделал еще несколько чтений по этой проблеме и по ссылкам, которыми вы поделились. После преобразования строки в NSData и выбора кодировки NSUTF16, а затем создания строки NSAttributed, теперь отображаются эмодзи. Но каким-то образом этот код также удаляет новые строки.
 – 
Abdullah Umer
14 Окт 2019 в 15:01

2 ответа

Используйте юникод эмодзи. в вашем случае юникод для красного сердца: U + 2764 U + FE0F.

  • Код цели C:

    cell.commentTextLabel.text = @"تم البيع والله يبارك للمشتري \U00002764 \U0000FE0F";
    
  • Свифт код:

    cell.commentTextLabel.text = "تم البيع والله يبارك للمشتري \u{2764} \u{FE0F}"
    

Чтобы увидеть больше смайлов, в Xcode выберите Редактировать -> Смайлы и символы , выберите смайлик, щелкните его правой кнопкой мыши и нажмите кнопку Копировать информацию о персонаже . Вставьте его и получите за красное сердечко:

❤️
red heart
Unicode: U+2764 U+FE0F, UTF-8: E2 9D A4 EF B8 8F
0
sihem mohamed 15 Окт 2019 в 13:16

Мне удалось решить эту проблему, используя следующий код:

    NSData *data = [comment.body dataUsingEncoding:NSUTF16StringEncoding allowLossyConversion:false];

    NSMutableAttributedString *str = [[NSMutableAttributedString alloc ] initWithData:data options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType} documentAttributes:nil error:nil];
    UIFont *cellFont = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];

    NSDictionary *attributesDictionary;
    NSMutableParagraphStyle *paragraphStyle =
    [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineSpacing = 10;
    paragraphStyle.alignment = NSTextAlignmentRight;

    attributesDictionary = @{
        NSParagraphStyleAttributeName : paragraphStyle,
        NSFontAttributeName : cellFont
    };

    [str addAttributes:attributesDictionary range:NSMakeRange(0, str.length)];

    cell.commentTextLabel.attributedText = str;

Здесь comment.body - это строка, полученная с сервера и содержащая эмодзи.

Результат был такой:

enter image description here

Спасибо Ларме за помощь в комментариях.

0
Abdullah Umer 17 Окт 2019 в 14:17