中文字符串
要想實現字符流水燈,先要實現中文字符串截取,因為在love2d里含有中文時string.sub失效。
可能學得不好吧,為了實現love2d的中文字符串截取,居然在此耗費了五六個小時。一開始
我想的是通過編寫C/C++擴展來實現,於是有了c++截取漢字和英文混合字符串這篇文章。可
是等我生成dll后居然發現是亂碼,以為是自己的代碼問題,折騰了半天還是沒有結果,后來吃
飯后回來突然想到可能是編碼問題。於是在win的命令行上右鍵查看屬性是936編碼,可見cmd
是不支持utf-8的,而我的lua編碼是utf-8,於是把lua文件另存為ansi碼,再運行居然可以了。
當我天真的想這下應該可以截取中文字符串時,寫了一個love2d的測試程序卻發現還是那個錯誤,
decode error invalid utf8。我想難道是我的工程要設為UNICODE,於是又改為UNICODE,還是
如此。
后來,冷靜的想了一下,覺得可能不是我的代碼的問題,在lua里中文截取是沒問題的,可是在
love2d里卻又問題,這是什么原因呢。lua是用純C實現的,既然如此我調用C++/C的字符串函數
與在lua里調用lua的字符串函數應該是等效的,那我通過C/C++里的字符串函數來截取中文字符串
導出給lua后,在love2d里當然還是出錯。那么自己實現一個字符串函數,開始我也這么想,可是
后來折騰了一下放棄了。
怎么辦?還是用我在簡單拼音輸入法里的方法,利用一個lua文件把字符串轉為tabel存到另一個
lua文件里。后來雖然實現了,可是發現也不好,在linux下用lua zhstr.lua生成的lua是亂碼,在win
下也是如此,不過在scite里運行后生成的卻是ansi正常編碼的lua文件。
--字符串轉table,支持中英文混排 --會在當前目錄下生成talk.lua function zhstr(str,tname) local f = io.open("talk.lua", "a") local len=#str f:write(tname,"={") local i=1 while(i<len) do if string.byte(str,i,i)>127 then f:write("\"",string.sub(str,i,i+1),"\",") i=i+2 else f:write("\"",string.sub(str,i,i),"\",") i=i+1 end end f:write("}") f:write("\n") f:close() end zhstr("半山無極","talk1") zhstr("你好","talk2") zhstr("hello world","talk3")
下面說一下如何使用,把上面的代碼放到scite里,zhstr函數有兩個參數
第一個是待轉換字符串,支持中英文混排,第二個是生成表后的表名。
由於采用的是附加模式讀寫文件,建議把你要的轉換的信息都放在zhstr.lua里
使用zhstr()函數,每次修改后刪除生成的talks.lua,並在scite里重新運行,
然后轉換talks.lua為utf-8無bom編碼。
字符流水燈
由於我們已經把字符串存為了表,實現流水燈就比較簡單了,每隔一段時間
把表里的字符取出並連接就可以了。
require('talk') --說明請注意自行修改字體 --滾動文字 t字符串表,rate出現時間間隔 function rollText(t,rate) local count=0 local i=1 local str="" local function text() count=count+love.timer.getDelta() if count>rate then count=0 if i<=#t then str=str.. t[i] i=i+1 end end return str end return text end function love.load() font=love.graphics.newFont("YaHeiConsolas.ttf",48) love.graphics.setFont(font) --rollText是函數類型 roll=rollText(talk1,0.3) end function love.draw() str=roll() love.graphics.print(str,100,100) end
效果如圖,代碼點擊下載。 當然這只是暫時之法,等以后我把Qt熟悉后,寫一個對話編譯器。

2013-4-14修正,love里string.sub()對中文可以支持,但是居然一個中文占3個字節,即
string.sub("你好",1,3)輸出"你"。太不可思議了,我還是第一次見到三字節編碼,不知道其
內部如何實現,有知道的大俠請不吝告知。
