2009-09-24 22 views
0

我解析與mochiweb_html的HTML頁面,並要分析以下文本片段解析「– 」使用Erlang重新

基本上我想拆就空間字符串並破折號字符並提取第一個字符中的數字。

現在上面的字符串表示爲下面的列表二郎

[48,32,226,128,147,32,49] 

我想用下面的正則表達式來分割它:

{ok, P}=re:compile("\\xD2\\x80\\x93"), %% characters 226, 128, 147 

re:split([48,32,226,128,147,32,49], P, [{return, list}]) 

但是,這並不正常工作;似乎\ XD2字符的問題[如果我從正則表達式中刪除它時,會出現分裂]

可能有人可以解釋

  • 我在做什麼錯在這裏?
  • 爲什麼 '–' 字符看似需要用於表示三個整數[226,128,147]

感謝。

回答

2

226,128,147是E2,80,93的十六進制。

> {ok, P} = re:compile("\xE2\x80\x93"). 
... 
> re:split([48,32,226,128,147,32,49], P, [{return, list}]). 
["0 "," 1"] 
+0

你是對的。對不起浪費大家時間。 – Justin 2009-09-24 17:02:20

0

關於你的第二個問題,爲什麼一個破折號需要3個字節來編碼,這是因爲在你輸入破折號不是一個ASCII連字符(十六進制2D),但它是一個Unicode en-dash(十六進制2013)。您的代碼在UTF-8 encoding中收到,而不是更明顯的UCS-2 encoding。 Hex 2013以UTF-8編碼形式出現在E28093內部。

如果您的下一個問題是「爲什麼使用UTF-8」,那是因爲使用8位字符和以Null結尾的C風格字符串對通過UTF-8使用Unicode的舊系統進行改造要比將所有內容擴大爲更容易UCS-2或UCS-4。 UTF-8保持與ASCII和C字符串的兼容性,所以轉換可以在幾年或幾十年的時間內完成。寬字符需要「大爆炸」一次性轉換工作,一切都必須立即轉移到新系統。因此,在創建Unicode時,UTF-8在90年代早期的遺留系統上更受歡迎。

+0

Erlang是否使用寬字符取決於您的偏好。根據http://www.erlang.org/doc/man/unicode.html(在R13中增加),「[i] n列表中,Unicode數據被編碼爲整數,每個整數代表一個字符並簡單編碼爲Unicode字符的代碼點「。當然,沒有什麼能阻止你將UTF-8數據放入列表中,如果這適合你的程序。 二進制文件只能包含字節,通常是Latin-1或UTF-8。 – legoscia 2009-09-25 18:03:52

+0

謝謝。回答編輯適當。 – 2009-09-25 18:35:00