天龙八部0.4.1版本CEGUIString类严重bug

 


前段时间发了一个关于utf8精准字符串校对的帖子。事实上当输入所有gb2312的字符集和时候
将会受到制约。

天龙八部mbcs_lenth()的原始实现不能满足当下玩家对名称的输入需求。
因为当初对utf8不了解,凡事都是以完成功能为主,那个方法充其量能完成的功能是完成ascii字符
与中文汉字的精准校对,前段时间Qa提交了一个关于输入长度校对错误的bug。为此,我反复验证下
发现天龙的实现是错的,能实现这个功能纯粹是偶然。

典型的一个问题当我们把输入法状态切换到全角 输入“·”此时EditBox获得的长度就会有问题
我们在EditBox里面有个最大长度限制,当输入了这些相似字符时候就会造成Maxlenth产生偏差。

那么,原因出在哪里呢?
CEGUI中,utf8码组成的汉子都是3个字节的,并非我当初理解的双字节符号。
虽然教程上写得是说汉子多数占2字节,但是还有一部分是占3字节处理的,至于占4字节以上的我

暂时不知道如何发现,发现的话也可按照下表将其补齐。


utf8码串字符表示的东西不光有单字节数据,也有多字节数据...
 

 根据首字节判断长度
0x00-0x7F   1字节
0xC0-0xDF   2字节
0xE0-0xEF   3字节
0xF0-0xF7   4字节
0xF8-0xFB   5字节
0xFC-0xFD   6字节


 

	// 天龙八部实现的版本对utf8的操作有错误
	// utf8下面并非所有的汉子都是3个字符,另外utf8表现形式分多个字节表现
	// 0.4.1实现的encode_size()里面就存在长度计算错误,这个错误在0.75版本后更正
	// 下面的实现是针对0.75版本做的多字节可视字符计算

	size_type mbcs_length( void ) const
	{ 
		const utf8* buf = build_utf8_buff();
		size_type   len = d_encodeddatlen - 1;// d_encodedbufflen是buff长度,在执行build_utf8_buff时候内部增加了1所以减去之

		utf8 tcp;
		size_type count = 0;
		size_type size = 0;

		while ( len-- )
		{
			tcp = *buf++;
			++count;
			size = 0;

			if ( tcp < 0x80 )
			{
			}
			else if( tcp < 0xE0 )
			{
				size = 1;
				++buf;
				++count;
			}
			else if( tcp < 0xF0 )
			{
				size = 2;
				buf += 2;
				++count;
			}
			else
			{
				size = 3;
				buf += 3;
				++count;
			}

			if ( len >= size )
			{
				len -= size;
			}
			else 
			{
				break;
			}
		}

		return count;
	}


 

 由于汉字字符集做到3,4字节就足够,目前未增加对5,6字节的解析需要的话自行添加就ok了

当然这个问题目前来看并不影响使用,所以不会造成太大的问题
作为程序来讲,真正看到问题的本质才是重要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值