2012-07-20 42 views
4

我試圖在lua中將一些法文文本轉換爲大寫,它不會轉換重音字符。任何想法爲什麼?lua string.upper不能使用重音字符?

測試腳本:

打印( 'ECHELLE')
打印(string.upper( 'ECHELLE'))
打印( 'ECHELLE')
打印(string.lower('階梯「))

輸出:

ECHELLE
階梯
階梯
階梯

回答

0

Lua中只是使用C庫函數toupper,這AFAIK doesn't support accented characters。你需要自己寫一個例程。

+0

Lua的'toupper'支持語言環境,與編碼不同。 – lhf 2012-07-20 13:40:46

3

這可能有點矯枉過正,但你可以用slnunicode(這是在LuaRocks中可用)做到這一點。

require "unicode" 
print(unicode.utf8.upper("échelle")) 
-- ÉCHELLE 

您可能需要使用unicode.ascii.upperunicode.latin1.upper取決於你的源文件的編碼。

+1

該OP似乎是使用拉丁語1. – lhf 2012-07-20 12:31:03

0

爲了更有效地解釋這一點,Lua沒有內置的對非ASCII字符串的支持。您可以存儲Latin-1或UTF-8編碼的字符串,但是任何特殊字符串操作函數(upperlower等)都不適用於任何非ASCII字符。

有一些Lua庫添加了不同程度的Unicode支持。所以你將不得不使用其中之一。

+0

這不完全正確。 'string.lower'使用C的'tolower',這取決於當前的語言環境。但我想這意味着如果重音字母需要多個字節,它將適用於Latin-1編碼的字符串,但不適用於UTF-8編碼的字符串。 – lhf 2012-07-20 11:22:39

+0

@lhf:無法保證當前本地(特定於平臺)理解Latin-1或UTF-8或任何特定的編碼。 – 2012-07-20 16:46:40

3

您需要設置合適的語言環境,這取決於這些字符串在源中的編碼方式。 由於輸出的結果,你似乎正在使用拉丁文1。 在這種情況下,試圖將線下在你的腳本的頂部:

os.setlocale("fr_FR.ISO8859-1")

此名稱是適用於Mac OS X.對於Linux,嘗試

os.setlocale("fr_FR.iso88591")

如果」重新使用UTF,那麼設置語言環境將無濟於事,因爲string.lower一次只能將字符串轉換爲一個字節。