前段时间发了一个关于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了
当然这个问题目前来看并不影响使用,所以不会造成太大的问题
作为程序来讲,真正看到问题的本质才是重要的。