2015-01-09 189 views
2

我一直在尋找合適的解決方案,以便如何將Unicode符號(ἔ)轉換爲相應的Unicode實體(ἔ)。我有一個文本文件,其中包含許多像ῶἤÜὰὔ這樣的符號。我正在尋找一個python甚至Perl腳本,它可以將該文件作爲參數並處理每個符號,並將其等價的Unicode實體寫入輸出文件中。我看到類似的問題here,但它正在處理html實體。將unicode符號轉換爲unicode實體

+2

沒有兩個不同的事情稱爲unicode的實體和HTML實體,它們是相同的 – ysth

+0

例如代替的ἔ [HTML實體(十六進制)]我需要ἔ [HTML實體(十進制)]。 – Jagath

+1

爲什麼?他們相當於 – ysth

回答

2

的Python 3.3+:

#coding: utf8 
import re 
s = 'abcῶἤÜὰὔdef' 
s = re.sub(r'[\x80-\U0010FFFF]', lambda x: '&#x{:04X};'.format(ord(x.group(0))), s) 
print(s) 
  • re.sub使用正則表達式和替換功能。
  • r'[\x80-\U0010FFFF]'匹配單個非ASCII Unicode字符。
  • lambda x: '&x{:04X};'.format(ord(x.group(0)))是一個接收正則表達式匹配的匿名函數。 x是匹配對象。 x.group(0)是匹配的子字符串。 ord給出該字符的Unicode序號,format生成所需的html實體字符串作爲替換。 λ表達式是等效於功能:
def replacement(matchobj): 
     substring = matchobj.group(0) 
     unicode_value = ord(substring) 
     return '&x{:04X};'.format(unicode_value) 

輸出:

abcῶἤÜὰὔdef 
+0

這是完美的。你能寫一下在這裏做什麼嗎? – Jagath

+0

@blackburn,已更新。 –

4

perl -Ci -0777 -E 'print map {sprintf "&#x%04x;", ord $_} split(//,<>)' foo.txt

+1

有沒有一種方法在這個過程中沒有改變ascii字符。另外,請你詳細說明在這裏完成的過程。 – Jagath