需求描述:

有两个字符串, 需要根据最长的串求出一个合理的大小, 这个大小等于最长串大小, 并绘制成分式效果, 默认 一个汉字占 三个utf8字符,一个字母占1个 ,   直接跟strlen 计算长度将不准确.

真实效果如图:  

要计算中间串占用长度先得分以下三步:

1:  UTF8 的中英文混合串 转为UNICODE 字符串;

2:  区分中文和英文, 分别计算大小;

3: 将所有字符串组合直接用渲染引擎绘制(GDI,opengl等都可以);

代码如下:

utf8转unicode:

std::wstring utf82Unicode(const char* str){libiconv_t h = 0;if(sizeof(wchar_t) == 2)h = iconv_open("UTF-16LE", codepage);else if(sizeof(wchar_t) == 4)h = iconv_open("UTF-32LE", codepage);if (h == (iconv_t)(-1))return 0;char* pInput = (char*)str;size_t nInput = nlen;std::wstring wStr;WStr.resize(nInput);char* pOutput = (char*)WStr.data();size_t nOutput = WStr.size() * sizeof(wchar_t);size_t err = iconv(h, &pInput, &nInput, &pOutput, &nOutput);if (err == 0)WStr.resize((WStr.size() * sizeof(wchar_t) - nOutput) / sizeof(wchar_t));elseWStr.clear();iconv_close(h);
return WStr;
}

求混合串长度:

bool IsChChar(wchar_t no)
{if (no >= 0x4E00 && no <= 0x9FA5)return true;return false;
}// uni >= '0' && uni <= '9' (*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z')int CalcStringLength(string & str, int defaultChineseCharlen = 2)
{std::wstring wstr1 = utf82Unicode(str.c_str());int len = 0;for (int i = 0; i < wstr1.size(); ++i){if (IsChChar(wstr1[i]))len += 2;elselen += 1;}return len;
}

组合成一个串:


string ExpressionNode::BaseLineCalc(ExpressionNode * lineNode, string & v1, string & v2)
{int len1 = CalcStringLength(v1->m_FdValue);int len2 = CalcStringLength(v2->m_FdValue);int len = len1 > len2 ? len1 : len2;if (len == 0)return "";int blanksize = len1 > len2 ? (len1 - len2): (len2 - len1);if (blanksize > 0){string tmp("");for (int i = 0; i < blanksize/2; i++){tmp += " ";}GsString retStr("");if (len1 > len2){      retStr += tmp;retStr+= (v2->m_FdValue);retStr += tmp;v2->m_FdValue = retStr;}else{retStr += tmp;retStr += (v1->m_FdValue);retStr += tmp;v1->m_FdValue = retStr;}}string tmp = "\n";for (int i = 0; i < len; i++)tmp += "-";tmp += "\n";return tmp;
}

计算UTF8中英文混合字符串的长度相关推荐

  1. Javascript中得到中英文混合字符串的长度

    有同事在公司的OA上发了个贴子,介绍在javascript中如何得到中英文混合字符串的长度. 用的是正则表达式. var str = "坦克是tank的音译";var len = ...

  2. ASP如何计算中英文混合字符串长度和截取字符串

    用ASP做网站的时候经常会碰到要截取字符串的情况.ASP中的Len函数不管是中文字符,还是英文字符,统统按一个单位来计算,由于一个中文字符的宽度是一个英文字符宽度的两倍,在中英文混合的情况下字符串实际 ...

  3. 中英文混合字符串长度的获取

    在项目中要处理中英文混合字符串的长度,中文按2个字符算,英文按1个字符算.以下是我处理的方法,不知道有没有更好的方法. private int GetGBLength(string strData) ...

  4. 计算中英文混合字符串长度

    - (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//第一种方法NS ...

  5. C#实现 获取指定字节长度 中英文混合字符串 的方法

    平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错.尤其是插入中英文混合字符串时,SQL Server中一般中文要占 ...

  6. php判断字符串里有英文,PHP针对中英文混合字符串长度判断及截取方法示例

    本文实例讲述了PHP针对中英文混合字符串长度判断及截取方法.分享给大家供大家参考,具体如下: /** * * 中英混合字符串长度判断 * @param unknown_type $str * @par ...

  7. 【代码笔记】iOS-判断中英文混合的字符长度的两种方法

    一,代码. - (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//第 ...

  8. php截取英语,php 截取中英文混合字符串的方法

    php 截取中应为字符串,就不必再用substr或者mb_substr //截取想这样的字符串 a李三 利用ASCII /** * * 中英混合的字符串截取 * @param unknown_type ...

  9. PHP截取中英文混合字符串

    <?php /*** 截取中英文混合字符串* @param $sourcestr 需要截取的字符串* @param $start 开始位置,字符位置,* @param $cutlength 结束 ...

最新文章

  1. 阿里云:国际化是云计算技术能力的照妖镜
  2. html中运行php脚本,php脚本在html文件中
  3. 在java web项目中编写自己的代码生成器
  4. 机器视觉:Asymmetry Problem in Computer Vision
  5. HTML5-WebSocket实现对服务器CPU实时监控
  6. [数分提高]2014-2015-2第8教学周第1次课 (2015-04-21)
  7. pip 删除安装包_Python中PIP的快速指南
  8. 科学家的假想-substr的妙用
  9. 一款纯css3实现的超炫动画背画特效
  10. 网页mp3提取器_用Python写一个酷狗音乐下载器!
  11. 智能手机收邮件之Mobile
  12. 了解计算机编码的一般特征,教招信息知识点:计算机编码的一般特征
  13. 【工具】获取窗口与控件信息
  14. 创业邦:谈谈 To B业务的机会
  15. java实现word(docx)在线编辑(word转html,html转word)——代码实现
  16. ECshop二次开发细节
  17. PHP 富文本内容中图片路径追加域名
  18. tablayout 滚动模式_Android底部导航栏(可滑动)----TabLayout+viewPager
  19. 增加tensor维度 torch
  20. 性格内向的人,是否适合做产品经理 ?

热门文章

  1. RDIFramework.NET(.NET快速信息化系统开发框架) Web版介绍
  2. Hadoop:MapReduce应用
  3. USB3.0、PCIe、PCI等各总线速度对比与介绍
  4. 系统架构设计师考查重点
  5. Python 入门之类的继承
  6. 基于微服务,打造共享开发平台
  7. jQuery实现简单的农场小游戏
  8. 运行java -jar xxxx.jar 报ConfigServletWebServerApplicationContext : Exception encountered during contex
  9. Android 学习之那些年我们遇到的BUG5:java.lang.IllegalArgumentException: You cannot start a load on a null Contex
  10. 【信号处理】基于小波变换的音频水印嵌入提取matlab源码