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