2010-07-07 31 views
1

我在寫一個bash腳本,需要解析包含特殊字符(如@!'ó)的html。目前,我已經運行了整個腳本,並忽略或忽略這些查詢,因爲它們是以十進制Unicode形式從服務器返回的:'。我已經想出瞭如何解析並轉換爲十六進制,並將它們加載到python中以將它們轉換回它們的符號,我想知道bash是否可以在本地執行最終轉換。在python簡單的例子:Bash相當於Python的字符串文字用於utf字符串轉換

print ur"\u0032" ur"\u0033" ur"\u0040" 

打印出

[email protected] 

能否實現猛砸同樣的結果?我已經看過iconv,但我不認爲它可以做我想要的,或者更可能我只是不知道如何。

這裏的一些相關信息:

Python String Literals

Hex to UTF conversion in Python

這裏是預期的輸入輸出的一些例子。

Ludwig van Beethoven - 5th Symphony and 6th Symphony ''Pastoral'' - Boston Symphony Orchestra - Charles Munch

Ludwig van Beethoven - 5th Symphony and 6th Symphony ''Pastoral'' - Boston Symphony Orchestra - Charles Munch

АлисА (Alisa) - Мы вместе. ХХ лет (My vmeste XX let)

АлисА (Alisa) - Мы вместе. ХХ лет (My vmeste XX let)

+0

你不能調用Python或perl從那個bash腳本來處理字符串? – mykhal 2010-07-07 00:51:33

+0

近這樣做: '回聲 'А л и с А(阿利薩)' | perl -pe's&#(\ d +);(?{$ x = sprintf(「%04x」,int($ 1))})/ \ N {U + $ x}/g'' 不幸的是,如果出現'UnicodeEncodeError',則添加'reload(sys);};如果發生'UnicodeEncodeError',則會出現$ x'轉換的一些問題,因此unicode字符是錯誤的 – mykhal 2010-07-07 01:17:59

回答

2

printf內置Bash中不支持Unicode碼,但外部printf(至少在我的基於GNU系統)的作用:

$ /usr/bin/printf "\u0410\u043b\u0438\u0441\u0410" 
АлисА 

或本,它從你的路徑的情況下,選擇printf它不/usr/bin

$ $(type -P printf) "\u0410\u043b\u0438\u0441\u0410" 
АлисА 

$ env printf "\u0410\u043b\u0438\u0441\u0410" 
АлисА 
+0

Dennis Williamson:它比發送一個字符串到一些python/perl /無論哪一行更好 – mykhal 2010-07-07 09:08:43

+0

謝謝!我認爲它不應該像我想的那麼困難,但現在我正在研究python,它看起來相當有吸引力的學習。 – dmikalova 2010-07-07 16:39:52

+0

更不用說有人已經制作了模塊來對html進行編碼和解碼。 – dmikalova 2010-07-07 16:54:41

1

可能的解決方案,例如:

$ function conv() { echo $* | python -c 'import re, sys; print re.sub(r"&#(\d+);", lambda x: unichr(int(x.group(1))), sys.stdin.read()).rstrip()' ; } 
$ conv 'АлисА (Alisa)' 
АлисА (Alisa) 
+0

。 sys.setdefaultencoding(「UTF-8」);'在'import re,sys;'後面' – mykhal 2010-07-07 01:40:08

+0

謝謝!我對編程還不熟悉,我不知道調用python或其他語言是否會導致系統資源的大量使用? – dmikalova 2010-07-07 02:10:57

+0

@teratomata是的,它很慢。啓動例如perl比python相當費勁。但我會仍然比如果你可以直接在bash(回聲)中執行它更慢 – mykhal 2010-07-07 06:48:05