游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4526|回复: 8

CEGUI + LUA的一个吐血问题,已头疼两天+

[复制链接]

5

主题

18

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2009-8-5 19:58:00 | 显示全部楼层 |阅读模式
为CEGUI配置中文字体后,使用C++调用和操作CEGUI,中文能够正常的处理和显示

例如:

Editbox * editbox = static_cast<Editbox*>(m_WinMgr.getWindow("Demo8/Window1/Controls/Editbox"));
Listbox * listbox = static_cast<Listbox*>(m_WinMgr.getWindow("Demo8/Window1/Listbox"));
           
CEGUI::String edit_str(editbox->getText());

ListboxTextItem* tempItem = new ListboxTextItem(edit_str);
listbox->addItem(tempItem);

testText->setText(mbcs_to_utf8((const char*)"中文测试"));

等等均可以正确的获取到控件上输入的中文,并设置给其它控件等.


但是将逻辑移到lua中,中文就完全不能处理了

例如:

local editbox = winMgr:getWindow("Demo8/Window1/Controls/Editbox")
local listbox = CEGUI.toListbox(winMgr:getWindow("Demo8/Window1/Listbox"))
local addbutton = winMgr:getWindow("Demo8/Window1/Controls/Add")

addbutton:setText(editbox:getText())

print(editbox:getText())

CEGUI.Logger:getSingleton():logEvent(editbox:getText())

local newItem = CEGUI.createListboxTextItem(editbox:getText())

listbox:addItem(newItem)

将全部得到乱码

getText()得到的 能正常显示在控件上的中文 ,用于输出,记log,或者设置给其它控件,均显示的是乱码.

而在lua中单纯写入的中文可以正常显示

print("中文测试")       --正常

CEGUI.Logger:getSingleton():logEvent("中文测试")    --乱码


print是lua自己的东西,如果这样都出乱码,那lua也不用玩了-_-

以上现象分析: lua与cegui的编码格式可能不同,lua与cegui交互,从cegui获得的中文字符串,或传给cegui的中文字符串,两方均不能正常解析,彼此都认不出,都为乱码.

尝试在lua中将中文字符串编码方式转换后再发送给cegui,  lua的字符串编码, 要么为ascii,要么为unicode
cegui::string的编码方式, 目前已知的有,接收utf8的构造函数

所以,写了N个编码转换函数进行尝试
AsciiToUnicode , AsciiToUtf8 , unicodeToUtf8 , ..............
(均进行了测试,转换正确)

然后将这些函数导入到lua中

EditBox:setText(AsciiToUnicode(str))
EditBox:setText(AsciiToUtf8(str))
EditBox:setText(unicodeToUtf8(str))

几乎常用的所有编码能试的全试了,结果只是乱码更乱....

求高手指点..万分感谢

如果回帖说不清..QQ67997876, 或者发个电话号码我打电话过去

lua与cegui之间究竟发生了什么,它们之间有着怎样不可告人的秘密?

2

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2009-8-5 21:33:00 | 显示全部楼层

Re:CEGUI + LUA的一个吐血问题,已头疼两天+

lua里的字符串没有特定的编码,它只当是一串字节处理。

对于lua源文件里的字符串,如果你的lua文件没有特意保存成UTF8,那么就是系统的的本地编码,如果你的系统是中文Windows,那就是MBCS编码,更具体的说就是GB编码,而不是Ascii。另外,官方的lua版本不支持UTF16编码,就是说lua源文件不能使用UTF16保存,否则解析会出错。

明确了lua内的编码后,需要再搞清CEGUI脚本接口使用的字符串编码。可以看它的源码,我没看到过那么细节。不过猜测不可能是UTF16,因为标准lua不支持UTF16串。所以只可能是UTF8或系统本地编码,当然也可能两者都有……

假设你存lua源文件时没有指定UTF8编码,那么源文件是MBCS编码。那么通过这一条出乱码
CEGUI.Logger:getSingleton():logEvent("中文测试")
可以推断,logEvent的输入应该不是MBCS,那么就只能是UTF8。

奇怪的是
addbutton:setText(editbox:getText())
会出现乱码……

5

主题

18

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2009-8-5 23:30:00 | 显示全部楼层

Re:CEGUI + LUA的一个吐血问题,已头疼两天+

"问题在于,在lua实现gettext函数的时候,把得到的字符串从CEGUI::string转化成了char* 类型,导致了中文格式的不符。在后面创建item以及additem后无法显示"

在网上搜到了这句话

那么,在lua中直接setText("中文测试"),没能显示出中文,应该是lua文件不是utf8格式的导致的

而getText得到的中文,相当于str = (char *)CEGUI::String.c_str(), 直接取到了CEGUI::String的buffer, 这个buffer是以utf8编码的, 在lua中,将此buffer作为char *显示,结果导致乱码

照这样分析,就应该把这个buffer转换为unicode,或者ascii来显示, 那么需要的转换函数就是utf8ToAscii

不知道这样分析的对不对.....


88

主题

2743

帖子

4227

积分

论坛元老

Rank: 8Rank: 8

积分
4227
发表于 2009-8-6 08:11:00 | 显示全部楼层

Re:CEGUI + LUA的一个吐血问题,已头疼两天+

貌似现成的东西并不好用,本想走捷径,最后发现此路不通,真不知道为什么要这样来用,呵呵

5

主题

18

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2009-8-6 15:09:00 | 显示全部楼层

Re:CEGUI + LUA的一个吐血问题,已头疼两天+

自己顶一下。。。

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2009-8-6 20:11:00 | 显示全部楼层

Re:CEGUI + LUA的一个吐血问题,已头疼两天+

我原来想做游戏  不过现在却喜欢做游戏界面了

所以现在正在为自己的游戏控件库奋斗着.

目标是实现linux的那种窗口变形效果

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2009-8-7 17:16:00 | 显示全部楼层

Re: Re:CEGUI + LUA的一个吐血问题,已头疼两天+

flyue: Re:CEGUI + LUA的一个吐血问题,已头疼两天+

我原来想做游戏  不过现在却喜欢做游戏界面了

所以现在正在为自己的游戏控件库奋斗着.

目标是实现linux的那种窗口变形效果

你说的是XGL吧?

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2009-8-8 07:53:00 | 显示全部楼层

Re:CEGUI + LUA的一个吐血问题,已头疼两天+

没错 就是xgl
其实这东西我怎么看都是2D的  除了那个正方体

0

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2009-9-10 16:43:00 | 显示全部楼层

Re:CEGUI + LUA的一个吐血问题,已头疼两天+

只要将你的lua文件保存为UTF8编码
格式就好了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-6 09:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表