[{"data":1,"prerenderedAt":81},["ShallowReactive",2],{"page-字符串-1":3,"page-count-字符串":80},[4],{"id":5,"title":6,"body":7,"date":56,"description":13,"extension":57,"meta":58,"navigation":61,"path":73,"seo":74,"stem":75,"tags":76,"__hash__":79},"blogs\u002F_legacy\u002F2012\u002F2012-12-28-c%e4%b8%ad%e6%96%87%e5%88%86%e5%89%b2.md","C++中文分割",{"type":8,"value":9,"toc":52},"minimark",[10,14,17,20,23,35,38,49],[11,12,13],"p",{},"其实最近一直都有遇到c++内的中文字符串问题，不过一直都通过各种方法绕过了。",[11,15,16],{},"可是今天遇到了需要将字符串的中文和英文按字符分割的问题，实在是没有取巧的方法了。",[11,18,19],{},"由于从资源文件读取出来的是utf-8编码，而输出时也是用的utf-8编码。如果在中途对字符串进行转化处理的话实在是没有什么必要性。其实一直很好奇，无论是什么格式的编码，windows都是能正常识别的。最重要的是size和length返回的长度不同的话，那么内部就一定有相应的检测机制。于是，开始找字符编码相关的资料。以结论而言是这样的，UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下：",[11,21,22],{},"UCS-2编码(16进制) UTF-8 字节流(二进制)",[24,25,26,29,32],"blockquote",{},[11,27,28],{},"0000 - 007F 0xxxxxxx",[11,30,31],{},"0080 - 07FF 110xxxxx 10xxxxxx",[11,33,34],{},"0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx",[11,36,37],{},"至于具体编码对应字符是怎样的其实并不重要了，对于分割utf-8字符而言，只要知道编码规则就好了。于是，接下来的工作就简单了。",[39,40,45],"pre",{"className":41,"code":43,"language":44},[42],"language-text","sum = strlen(fullline);\nfor(int cur = 0;cur\u003Csum;cur++)\n{       \n                char t = fulline[cur];\n        if((t&0xE0) == 0xE0){   \u002F\u002F3byte\n                lines = lines + t + fulline[cur+1] + fulline[cur+2];\n                cur += 3;\n\n        }else if((t&0xC0) == 0xC0){\u002F\u002F2byte\n                lines = lines + t + fulline[cur+1];\n                cur += 2;\n        }else{\u002F\u002F1byte\n            lines = lines + t;\n            cur++;\n        }\n        printf(\"streaming text:%s\",lines.c_str());\n}\n","text",[46,47,43],"code",{"__ignoreMap":48},"",[11,50,51],{},"至于GB2312编码，由于固定是双字节的，分割上就不会有什么问题了。",{"title":48,"searchDepth":53,"depth":54,"links":55},2,3,[],"2012-12-28","md",{"layout":59,"status":60,"published":61,"author":62,"author_login":63,"author_email":64,"author_url":65,"wordpress_id":66,"wordpress_url":67,"date_gmt":68,"excerpt":69},"post","publish",true,{"display_name":63,"login":63,"email":64,"url":65},"chaoshikari","chaoshikari@gmail.com","\u002F",543,"\u002F\u002F?p=543","2012-12-28 01:35:34 +0000",{"type":8,"value":70},[71],[11,72,13],{},"\u002F2012-12-28-c中文分割",{"title":6,"description":13},"_legacy\u002F2012\u002F2012-12-28-c%e4%b8%ad%e6%96%87%e5%88%86%e5%89%b2",[77,78],"c++","字符串","PPsXuDCUhh7Y4-mLTuw-OHU0BD7oTm--uAo_WcGSsi0",1,1788763182029]