2013-06-19 135 views
4

我正在嘗試編寫一個函數,它將包含unicode字符的字符串轉換爲默認的ASCII轉錄。理想情況下,我想要Ångström變成Angstroem,或者如果不可能的話,Angstrom。同樣,α=χ應該變爲a=x(c?)或類似。Emacs lisp:將字符轉換爲標準ASCII轉錄

Emacs有這樣的內置的能力嗎?我知道我可以得到姓名和相似的字符(get-char-code-property),但我不知道內置的轉錄表。

其目的是將條目標題轉換爲有意義的可讀文件名,避免軟件無法理解unicode的問題。

我目前的策略是手工構建翻譯表,但這種方法相當有限,需要大量的維護。

+0

此代碼Xah李是一個部分解決你的問題:http://ergoemacs.org/emacs/emacs_zap_gremlins.html – Juancho

+0

謝謝,這幫助。至少它可以爲一些常用字符創建標準翻譯表(即使不是最優的,例如德語ü通常被轉換爲ue)。 – kdb

+2

沒有全球性的「最佳」。在其他語言中使用字符'ü',而不將其音譯爲'ue'。 – bobince

回答

1

沒有我知道的內置功能。我爲你的任務寫了一個包unidecode。它使用與Python's same-named庫中相同的方法。若要安裝只需添加MELPA庫到你的資料庫列表:

(add-to-list 'package-archives 
    '("melpa" . "http://melpa.milkbox.net/packages/") t) 

然後運行M-X包安裝RET unidecodeunidecode有2個函數,unidecode-unidecode將Unicode轉換爲ASCII,而unidecode-sanitize可丟棄非字母數字字符並將空格轉換爲連字符。

ELISP> (unidecode-unidecode "¡Hola!, Grüß Gott, Hyvää päivää, Tere õhtust, Bonġu Cześć!, Dobrý den, Здравствуйте!, Γειά σας, გამარჯობა") 
"!Hola!, Gruss Gott, Hyvaa paivaa, Tere ohtust, Bongu Czesc!, Dobry den, Zdravstvuite!, Geia sas, lmsllmlllmckhmslmgll" 
ELISP> (unidecode-sanitize "¡Hola!, Grüß Gott, Hyvää päivää, Tere õhtust, Bonġu Cześć!, Dobrý den, Здравствуйте!, Γειά σας, გამარჯობა") 
"hola-gruss-gott-hyvaa-paivaa-tere-ohtust-bongu-czesc-dobry-den-zdravstvuite-geia-sas-lmsllmlllmckhmslmgll"