2017-02-03 3 views
10

Я работаю над emojis по умолчанию в iOS. Я могу успешно кодировать и декодировать emojis по умолчанию, используя кодировку NSNonLossyASCIIStringEncoding.NSNonLossyASCIIStringEncoding возвращает nil

Его работа прекрасна, когда я отправил emojis с простым текстом, но он возвращает nil, когда в строку добавлен специальный символ. Как заставить его работать?

Код:

testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\"; 
    NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 
    // here strBody is nil 
+0

Что вы подразумеваете под словом «У меня две строки с одинаковыми символами Юникода»? testString1 и testString2 совершенно разные! –

+0

Текст отличается, но символы Unicode (символы Unicode от Emoji) одинаковы. например, \\ ud83d \\ ude21, это то же самое в обеих строках. –

+0

Отметьте это, как может помочь вам больше http: // stackoverflow.com/questions/26170876/how-to-list-почти-all-emojis-in-swift-for-ios-8-without-use-any-form-of-loo – tejas

ответ

6

Проблема связана с различными кодировками вы использовали для кодирования и декодирования.

testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\"; 
NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding]; 

Здесь вы преобразовали строку в данные с использованием кодировки UTF8. Это означает, что он преобразует символы Unicode в 1-4 байта в зависимости от используемого символа юникода. например. \ ude09 переведет на ED B8 89. Объяснение того же доступно in wiki. В основном используется следующий метод:

enter image description here

Теперь, если вы пытаетесь расшифровать это строка в кодировке ASCII, как показано ниже

NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 

выше, обречена на провал, поскольку он не может декодировать ED B8 89 или аналогичные данные Unicode в строку ascii. Вот почему он возвращает ошибку.

Если данные были закодированы в ascii, для преобразования использовался бы литерал ascii hex. Так \ ude09 стал бы «5с 75 64 65 30 39»

Так правильное преобразование будет:

testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\"; 
    NSData *data = [testString dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 
    NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 

вопрос для вас, почему вы хотите, чтобы кодировать в UTF8 и расшифровывают как ASCII?


Для смайликов, пожалуйста, попробуйте ниже

 testString=":;Hello \\ud83d\\ude09\\ud83d\\ude00 ., <> /?"; 
     NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding]; 
     NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 
+0

Таким образом, я сделал это стандартный способ избежать и unescape emojis. Если бы я сделал так, как вы говорите, он никогда не отобразит эможи. Пожалуйста, попробуйте Xcode, а затем дайте мне знать какое-либо действующее решение. –

+0

Ну, я ответил, почему он возвращает ноль. Вот в чем причина. Теперь вам нужно решение для emojis. Причина, по которой вышеупомянутое решение не работает, заключается в том, что вам нужно удвоить escape-коды своих символов в Юникоде. Пример: testString = ":; Hello \\ ud83d \\ ude09 \\ ud83 \\ ude00., <> /? \"; – manishg

+0

Я добавил в свой ответ, который будет работать для вас. – manishg

1

Если вы просто хотите иметь смайликов в вашем коде как литералы, есть два варианта:

A. Просто сделайте это:

NSString *hello = @"+_)(&#&)#&)$&$)&$)^#%!!#$%!"; 
NSLog(@"%@", hello); 

B. Добавить коды в UTF32

NSString *hello = @"\U0001F600\U0001F60E+_)(&#&)#&)$&$)&$)^#%!!#$%!"; 
NSLog(@"%@", hello); 

Оба принты: + _) (& # &) # &) $ & $) & $)^#% !! # $%!

У меня действительно не проблема.

+0

Проблема со специальными символами i-e "+ _) (& # &) # &) $ & $) & $)^#% !! # $%!". не с эмозисом. –

+0

Нет, не мне. Stil работает как ожидалось. –

Смежные вопросы