2015-05-14 78 views
1

嗨下面的代碼在Lua:的Lua string.match UTF - 要求西班牙字符 - 讓一半葡萄牙

letters = "Vocéá" 
print(string.match("¡Você","["..letters.."]+")) 

回報:

�Voc� 

,如果我取代常規電子郵件E和擺脫然後我得到「Voc」。似乎是干涉¡,é與ê。難道他們共享一個字節? 我不是在編碼方面的專家,但這些都是UTF16值,UTF8二進制代碼:

á(feff00e1) 1100 0011 1010 0001 
¡(feff00a1) 1100 0010 1010 0001 
ê(feff00ea) 1100 0011 1010 1010 
é(feff00e9) 1100 0011 1010 1001 

我怎麼忽略了葡萄牙字符&了「¡」(以及其他許多我不知道的)?

也許這不是最好的方法。我正在嘗試構建西班牙語標記器。我很驚訝,但匹配函數從一個不包含在我的匹配列表中的字符中返回一個問號。

+3

lua的字符串函數不支持utf-8。他們只是字節。所以這場比賽沒有達到你期望的水平。雖然lua 5.3有一個utf8庫。所以問題在於你將角色分成了兩半。 –

回答

1

字符和字節是兩個不同的東西。字符可以用不同的方式以字節編碼,使用不同的encodings。一種可能的編碼是UTF-8。不幸的是,Lua的string.match幾乎不知道任何關於字符和編碼的東西,它只能用於字節。所以你的腳本不是在尋找「V」,「c」,「o」,「á」,「é」字符,但是對於「\ x56」,「\ x63」,「\ x6F」 ,「\ xA1」,「\ xA9」,「\ xC3」字節。