问题描述

原来字串内容name为下面内容:

######name=杨乃文做DJ,微信公众号FunRadio。什么样的姿态是小丑姿态?2016046######

需要截取成大小为64的name_rm[64]的数组内容,出现如下乱码:

######name=杨乃文做DJ,微信公众号FunRadio。什么样的姿态#####

问题分析

UTF-8编码,汉字占3个字节,英文占一个字节,标点符号占领3个字节。

汉子:15*3=45
英文:10*1=10
标点符号:2*3=6
 
共61,64-61=3还可存放一个汉字。由于程序将最后一个字节设置为结尾符‘\0’,导致只剩截取需要三个字节存放的汉字,从而出现乱码。
 
问题解决
如果只能存放有效长度63(除掉结束符)的内容,
则从原来字串里面读取长度为63的内容里面的有效字符串。
 
上面按例有效字串长度为61,这样从原来字串提取61的长度,就不会出现乱码了。
 
提取有效字串长度代码:
  1. int getsubstringlen(char *string,int len)
  2. {
  3.  
  4. int j = ;
  5. int n = ;
  6. char *p = NULL;
  7.  
  8. int str_length = len;
  9.  
  10. p = string;
  11.  
  12. while(n <= str_length)
  13. {
  14.  
  15. if((*p & 0XFC)==0XFC)
  16. {
  17. j = ;
  18. }
  19. else if((*p & 0XF8)==0XF8)
  20. {
  21. j = ;
  22. }
  23. else if((*p & 0XF0)==0XF0)
  24. {
  25. j = ;
  26. }
  27. else if((*p & 0XE0)==0XE0)
  28. {
  29. j = ;
  30. }
  31. else if((*p & 0XC0)==0XC0)
  32. {
  33. j = ;
  34. }
  35. else
  36. {
  37. j = ;
  38. }
  39.  
  40. if (n+j<=str_length)
  41. {
  42. n += j;
  43. }else
  44. break;
  45.  
  46. p = p+j;
  47. }
  48.  
  49. return n;
  50.  
  51. }
参考资料:
http://blog.csdn.net/chary8088/article/details/21226375
 

UTF-8的编码规则很简单, 只有两条:

1) 对于单字节的符号, 字节的第一位设为0, 后面7位为这个符号的unicode码. 因此对于
   英语字母, UTF-8编码和ASCII码是相同的.

2) 对于n字节的符号(n>1), 第一个字节的前n位都设为1, 第n+1位设为0, 后面字节的前
   两位一律设为10. 剩下的没有提及的二进制位, 全部为这个符号的unicode码.

下表总结了编码规则, 字母x表示可用编码的位.

  1. <SPAN xmlns="http://www.w3.org/1999/xhtml">// #txt---
  2. | Unicode符号范围 | UTF-8编码方式
  3. n | (十六进制) | (二进制)
  4. ---+-----------------------+------------------------------------------------------
  5. 1 | 0000 0000 - 0000 007F | 0xxxxxxx
  6. 2 | 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
  7. 3 | 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
  8. 4 | 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  9. 5 | 0020 0000 - 03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  10. 6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  11.  
  12. 表 1. UTF-8的编码规则
  13. // #txt---end
  14. </SPAN>

截取UTF-8编码的汉字,最后一个字出现乱码的问题的更多相关文章

  1. 各种编码中汉字所占字节数;中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

    vim settings set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936,latin1set termencoding=utf-8se ...

  2. SQL 将URL编码转汉字!

    原文:SQL 将URL编码转汉字! -- ============================================= -- 作 者: ruijc -- 描 述: 将Url编码转明文字符 ...

  3. 如何用excel urldecode解码把url编码转为汉字?

    统计分析可以反映出网站运营的情况,并根据实际作出相应的调整,是站长必需的基础技能.ytkah感觉最好用的是谷歌统计,里面有个搜索关键词及对应受访页面,这个功能对优化用处很大,但大家都知道访问不太顺畅. ...

  4. Android项目,从web上取下汉字,中文部分乱码

    Android项目,从web上取下汉字,中文部分乱码. 常见问题,搜索一下,网上有很多办法解决.如果还没有试过这个办法,可以尝试一下. BufferedReader in = new Buffered ...

  5. 你不知道的 页面编码,浏览器选择编码,get,post各种乱码由来

    原文:你不知道的 页面编码,浏览器选择编码,get,post各种乱码由来 asp.net页面编码和浏览器的选择编码 每个asp.net的朋友都知道,在新版本的visual studio,在没有任何设置 ...

  6. 在UTF-8页面中引入编码为GBK的JavaScript文件乱码问题了

    原文地址:http://js8.in/2009/12/11/%E5%AF%B9%E5%BC%95%E7%94%A8%E5%A4%96%E9%83%A8javascript%E9%A1%B5%E9%9D ...

  7. URL编码以及GET和POST提交乱码解决方案 (转)

    1.  什么是URL编码. URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为URL的一部分或者分离的发送到服 ...

  8. JavaWeb使用Filter进行字符编码过滤 预防web服务中文乱码

    JavaWeb使用Filter进行字符编码过滤 预防web服务中文乱码 准备条件:一个创建好的 JavaWeb 项目 步骤: 1.创建一个类并实现 Filter 接口 import javax.ser ...

  9. ***PHP各种编码的汉字字符串截取

    虽然PHP有现成的截取字符串函数substr(),但是这个函数不能对汉字字符串进行截取,要实现这种效果还需要我们自己去编写相应的函数.汉字有多种编码,比如GB2312,UTF-8等,汉字字符串的截取需 ...

随机推荐

  1. 机器学习实战笔记(Python实现)-04-Logistic回归

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  2. [No0000A9]实用word用法

    目录  TOC \o "1-3" \h \z \u 三招去掉页眉那条横线.... PAGEREF _Toc465252982 \h 08D0C9EA79F9BACE118C8200 ...

  3. [LeetCode] Dungeon Game 地牢游戏

    The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...

  4. Mongodb数据库学习系列————(一)Mongodb数据库主从复制的搭建

    Mongodb数据库主从复制的搭建 Writeby:lipeng                                    date:2014-10-22 最近项目上用到了位置查询,在网上 ...

  5. SQLite源程序分析之sqlite3.c

    /****************************************************************************** ** This file is an a ...

  6. CSS3常用属性(边框、背景、文本效果、2D转换、3D转换、过渡、有过渡效果大图轮播、动画)

    CSS3边框: 1.CSS3圆角:border-radius  属性--创建边框线的圆角 <body style="font-size:24px; color:#60F;"& ...

  7. LINUX操作系统VIM的安装和配置

    VIM的安装   在命令行敲入"vi"后按"tab"键,可以看到目前系统中只安装了vi和vim.tiny. vim是从VI发展而来的一个文本编辑器,功能更强大. ...

  8. [翻译] Android是怎样绘制视图的

    原文:How Android Draws Views 当一个Activity获取到焦点的时候,它的布局就开始被绘制. 绘制的过程由Android framework处理.但布局层级的根节点必须由Act ...

  9. C# 在数组中判断是否存在某个数组值

    (1) 第一种方法: ,,}; ); // 这里的1就是你要查找的值 ) // 不存在 else // 存在 (2) 第二种方法: string[] strArr = {"a",& ...

  10. mongodb安装启动遇到的问题

    好不容易下载到了mongodb,配置的时候遇到了不少问题. 下载的是解压包,不是官网的,有一个bin目录,解压到一个自己想要的目录,如d:\mongo,首先把bin复制进来,然后创建data目录,da ...