2013-11-20 2 views
8

Возможно ли повторное кодирование emoji 3 или 4 байтовых строк в emoji снова?Как восстановить правильное кодирование 4-байтовых символов emoji, которые были сохранены в обычном utf8 - вот так: ðŸ~Š?

Я унаследовал таблицу MySQL Innodb с кодировкой utf8_unicode_ci. Эти emoji 4 байтовые строки повсюду. Можно ли перевести их обратно в эможи?

Первым шагом было изменение character set на utf8mb4. Это изменило все строки, такие как ð��£, на такие строки: 😊.

Но я действительно хочу перевести 😊 во что-то вроде smiley emoji. (Я понятия не имею, действительно ли 😊 действительно смайлик)

+1

Что «4-битные символы» вы говорите? И что вы подразумеваете, переведя эможи в эможи? Это похоже на несоответствие кодировки символов. Покажите некоторые фактические данные (шестнадцатеричный дамп или что-то еще, что дает реальные данные - « » - ХАРАКТЕР ЗАМЕНЫ, указывающий на ошибку данных на уровне символа, не сообщая, какие данные). –

+2

@ JukkaK.Korpela: [Emoji] (http://en.wikipedia.org/wiki/Emoji) находятся вне BMP, а это значит, что вам нужно 4 байта (а не бит), чтобы кодировать их как UTF-8. –

+0

Я изменил сортировку на utf8mb4, и теперь заменяющие символы выглядят как 'ðŸ~Š'. Но я до сих пор не уверен, как увидеть фактический персонаж эможи. – Ryan

ответ

0

Для большинства Эможи требуется 21 бит, который является частью Supplementary Multilingual Plane. В таблице на этой странице Emoji имеет префикс 1F, охватывающий 1F3 до 1F7. Если ваше приложение просто удалило верхние 5 бит, чтобы поместиться в 16 бит, вы остались бы с 3xxx -> 7xxx. Это в основном относится к азиатским идеограммам на эту информацию на Basic Multilingual Plane. Учитывая данные, которые вы показываете, это не идеограммы, вам, возможно, придется более глубоко проанализировать данные, чтобы узнать, можно ли восстановить его, объединив биты и добавив префикс 1F.

3

Вдохновленный Ignacio Vazquez-Abrams' comment. Следующий фрагмент кода Python показывает процедуру происхождения Emoji в Mojibake и наоборот (ремонт):

print ("\nEmoji to mojibake (origin):") 
for emojiChar in ['','','','']: 
    print (emojiChar, emojiChar.encode('utf8').decode('cp1252')) 

print ("\nmojibake to Emoji (repair):") 
for mojibakeString in ['😊','😣','👽','😎','🙇']: 
    print (mojibakeString, mojibakeString.encode('cp1252').decode('utf8')) 

Я знать, что вопрос помечен php, а не питона; позвольте мне надеяться, что аналогичное решение PHP может быть очень близко ...

Выход:

==> chcp 65001 
Active code page: 65001 

==> D:\test\Python\20108312.py 

Emoji to mojibake (origin): 
😊 
😣 
👽 
😎 

mojibake to Emoji (repair): 
😊 
😣 
👽 
😎 
🙇 

==> 

Python версии:

Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32