2016-06-23 53 views
2

我試圖建立一種方法來在twitter中找到emojis並將它們與unicode.org中的unicode表相關聯,但我很難找到它們,因爲我認爲是編碼問題,或者只是我對這個主題的誤解。簡而言之,我所做的是從http://www.unicode.org/emoji/charts/full-emoji-list.html的表格中創建一個表情符號庫,其中包含表情符號的標題和代碼點(代碼)。我用庫rvest在R中廢棄了這個。Twitter的表情符號編碼與twitteR和R的問題

問題來了,當我從Rick的twitteR API獲取信息時,由於emojis的代碼看起來並不像這個表中的代碼。

讓我們以100(百分)紅色圖標的表情符號爲例。這是該數字1468在鏈接之前表和它的代碼點代碼:

U+1F4AF 

現在,當我抓住它從Twitter,首先它是這個樣子的狀態類的API具有內置與推文一起工作。

\xed��\xed�� 

然後,一旦我將它轉換爲數據框,我也使用twitter API的內置函數執行此操作。例如:

tweet$toDataFrame() 

的表情符號變成這樣:

<ed><U+00A0><U+00BD><ed><U+00B2><U+00AF> 

我試圖將其與函數轉換的iconv在R,用以下代碼:

iconv(tweet$text, from="UTF-8", to="ASCII", "byte) 

和我只能使它看起來像這樣:

<ed><a0><bd><ed><b2><af> 

所以,結束了,在我的測試結束後,我得到了以下結果:

<ed><a0><bd><ed><b2><af> 
<ed><U+00A0><U+00BD><ed><U+00B2><U+00AF> 
\xed��\xed�� 

其中沒有看起來像表中指定的代碼點:

U+1F4AF 

是有沒有可能在兩個字符串之間進行轉換? 我錯過了什麼?爲什麼twitter會將這些信息返回給emojis?

+0

您是否找到解決方案? –

回答

6

我之前並不瞭解任何有關恩波丁的事情,但是在閱讀了幾天後,我想我知道發生了什麼。我不完全理解表情符號的編碼是如何工作的,但我偶然發現了同樣的問題並解決了它。

您想將\xed��\xed��映射到其名稱解碼版本:百分點。一個明智的方法可能是在線刮取字典並使用諸如Unicode之類的密鑰來替換它。在這種情況下,它將是U+1F4AF。 您展示的轉換是不是不同的編碼但對於相同的編碼的表情符號不同的符號:

  1. as.data.frame(tweet)回報<ed><U+00A0><U+00BD><ed><U+00B2><U+00AF>
  2. iconv(tweet, from="UTF-8", to="ASCII", "byte")返回<ed><a0><bd><ed><b2><af>

因此直接使用Unicode是不可行的。另一種方法是使用已經編碼爲<ed>...<ed>...的表情符號的字典,如下所示:emoji list。瞧!只有她的列表不完整,因爲它來自 包含較少表情符號的字典。

快速解決方案是來簡單地刮一個更完整的字典和映射<ed>...<ed>...與其相應的英文文本翻譯。我已經這樣做了,已發佈here

儘管沒有其他人用正確的編碼發佈了一個列表,但卻給我帶來了困擾。實際上,我發現的大多數字典都使用UTF-8編碼,而不是使用<ed>...<ed>...表示,而是使用<f0>...。事實證明,對於相同的unicode U+1F4AF,它們都是正確的UTF-8編碼,只有字節的讀取方式不同。

長答案。推文以UTF-16格式讀取,然後轉換爲UTF-8格式,這裏轉換分歧。當讀取由字節對完成時,結果將是UTF-8 <ed>...<ed>...,當它以四個字節的塊讀取時,結果將是UTF-8 <f0>...(爲什麼這是我不完全理解的,但我懷疑它與處理器的體系結構有關)。

因此,解決您的問題的一個較慢(但更有意識)的方法是刮<f0>...字典,將其轉換爲UTF-16,將其轉換回UTF-8成對,並最終以兩個<ed>...結束。這兩個<ed>...被稱爲Unicode U+xxxxx的低 - 高代理對代表。

作爲一個例子:

unicode <- 0x1F4Af 

# Multibyte Version 
intToUtf8(unicode) 

# Byte-pair Version 
hilo <- unicode2hilo(unicode) 
intToUtf8(hilo) 

返回:

[1] "\xf0\u009f\u0092�" 
[1] "\xed��\xed��" 

其中,再次,使用iconv(..., 'utf-8', 'latin1', 'byte'),是相同的:

[1] "<f0><9f><92><af>" 
[1] "<ed><a0><bd><ed><b2><af>" 

PS1。: 功能unicode2hilo是高低的簡單的線性變換爲Unicode

unicode2hilo <- function(unicode){ 
    hi = floor((unicode - 0x10000)/0x400) + 0xd800 
    lo = (unicode - 0x10000) + 0xdc00 - (hi-0xd800)*0x400 
    hilo = paste('0x', as.hexmode(c(hi,lo)), sep = '') 
    return(hilo) 
} 

hilo2unicode <- function(hi,lo){ 
    unicode = (hi - 0xD800) * 0x400 + lo - 0xDC00 + 0x10000 
    unicode = paste('0x', as.hexmode(unicode), sep = '') 
    return(unicode) 
} 

PS2。: 我會推薦使用iconv(tweet, 'UTF-8', 'latin1', 'byte')來保存特殊字符,如áäà。

PS3。: 要用英文文本,標籤,散列或任何你想要映射到的表情符號替換表情符號,我會建議在emojis圖形中使用DFS,因爲有一些emojis的unicode是其他更簡單的unicode(即<f0><9f><a4><b8><e2><80><8d><e2><99><82><ef><b8><8f>人cartwheeling,而獨立<f0><9f><a4><b8>人cartwheeling<e2><80><8d>什麼,<e2><99><82>男性標誌<ef><b8><8f>是什麼),並同時人cartwheeling人cartwheeling男性標誌明顯語義上相關,我更喜歡更忠實的翻譯。

+0

有趣的是,我一直在爲此而戰,並在兩天前解決了它。儘管如此,你的解決方案和解釋要比我想出的要好得多。這是那種值得最大的「接受爲答案」的答案。 希望這對許多其他人有用。 –

3

由菲利普·蘇亞雷斯科梅納雷斯提供的答案是優秀的,因爲它描述了這一問題的機制,但我想指出你here,這是一本字典我與<版> [R編碼製作專門針對Twitter的。我也有關於如何瀏覽和識別emojis的散文版本的代碼。對於未來絆倒這個問題的人來說,這可能會更容易一些。字典是最新的Unicode版本(9),一旦更新的版本出來,我也會更新它。