守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 963|回复: 0

[其他] 字符串逐字刷新

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51788
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-16 14:05:02 | 显示全部楼层 |阅读模式
    在做游戏剧情展示的时候遇到一种需求把游戏对话逐字显示给玩家,效果如下:




    实现这种效果的方式就是把一个字符串逐个中文取出来刷新到屏幕上,研究了各种编码之后发现UTF8的编码非常简单也很容易逐个/中文/英文/符号读取.首先看看UTF8非常简单的编码方式:

    • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
    • 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
    UTF8编码规则
            Unicode符号范围
             UTF-8编码方式
         
          (十六进制)
          (二进制)
       
         0000 0000-0000 007F
          0xxxxxxx
       
         0000 0080-0000 07FF
          110xxxxx 10xxxxxx
       
         0000 0800-0000 FFFF
          1110xxxx 10xxxxxx 10xxxxxx
       
         0001 0000-0010 FFFF
          11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
       按照规则可以使用如下算法算出一个中文所占的字符:
    1. /// 获取utf8字符长度
    2. int getUtf8Length( const char* pszutf8 )
    3. {
    4.     if( pszutf8 == NULL )
    5.     {
    6.         return 0;
    7.     }

    8.     for( int i = 8; i > 0; --i )
    9.     {
    10.         unsigned char c = 1 < < (i - 1);
    11.         if( ( pszutf8[0] & c ) != c )
    12.         {
    13.             if( i == 8 )
    14.             {
    15.                 return 1;
    16.             }
    17.             else
    18.             {
    19.                 return 8 - i;
    20.             }
    21.         }
    22.     }

    23.     return 1;
    24. }
    复制代码
    1. void Main()
    2. {
    3.     std::string strSrc = "我在马路边";
    4.     if( strSrc.empty() )
    5.     {
    6.         return;
    7.     }
    8.     size_t size = strSrc.length();
    9.     for( size_t i = 0; i < size; )
    10.     {
    11.         const unsigned char c = strSrc.at(i);
    12.         int len = getUtf8Length((const char*)&c);

    13.         i += len;

    14.         std::string strTemp = strSrc.substr( 0, i );
    15.         printf("%s\n",strTemp.c_str());
    16.         
    17.     }
    18. }
    复制代码
    打印出来可以看到:

    1. 我在
    2. 我在马
    3. 我在马路
    4. 我在马路边
    复制代码
    基本实现想要的展示效果.但是要求是必须输入的字符串是UTF8格式..


    参考文章





    本文来自:http://shadowkong.com/archives/1888


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-18 12:48 , Processed in 0.045799 second(s), 37 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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