我之前並不瞭解任何有關恩波丁的事情,但是在閱讀了幾天後,我想我知道發生了什麼。我不完全理解表情符號的編碼是如何工作的,但我偶然發現了同樣的問題並解決了它。
您想將\xed��\xed��
映射到其名稱解碼版本:百分點。一個明智的方法可能是在線刮取字典並使用諸如Unicode之類的密鑰來替換它。在這種情況下,它將是U+1F4AF
。 您展示的轉換是不是不同的編碼但對於相同的編碼的表情符號不同的符號:
as.data.frame(tweet)
回報<ed><U+00A0><U+00BD><ed><U+00B2><U+00AF>
。
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男性標誌明顯語義上相關,我更喜歡更忠實的翻譯。
您是否找到解決方案? –