计算UTF8中英文混合字符串的长度
需求描述:
有两个字符串, 需要根据最长的串求出一个合理的大小, 这个大小等于最长串大小, 并绘制成分式效果, 默认 一个汉字占 三个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中英文混合字符串的长度相关推荐
- Javascript中得到中英文混合字符串的长度
有同事在公司的OA上发了个贴子,介绍在javascript中如何得到中英文混合字符串的长度. 用的是正则表达式. var str = "坦克是tank的音译";var len = ...
- ASP如何计算中英文混合字符串长度和截取字符串
用ASP做网站的时候经常会碰到要截取字符串的情况.ASP中的Len函数不管是中文字符,还是英文字符,统统按一个单位来计算,由于一个中文字符的宽度是一个英文字符宽度的两倍,在中英文混合的情况下字符串实际 ...
- 中英文混合字符串长度的获取
在项目中要处理中英文混合字符串的长度,中文按2个字符算,英文按1个字符算.以下是我处理的方法,不知道有没有更好的方法. private int GetGBLength(string strData) ...
- 计算中英文混合字符串长度
- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//第一种方法NS ...
- C#实现 获取指定字节长度 中英文混合字符串 的方法
平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错.尤其是插入中英文混合字符串时,SQL Server中一般中文要占 ...
- php判断字符串里有英文,PHP针对中英文混合字符串长度判断及截取方法示例
本文实例讲述了PHP针对中英文混合字符串长度判断及截取方法.分享给大家供大家参考,具体如下: /** * * 中英混合字符串长度判断 * @param unknown_type $str * @par ...
- 【代码笔记】iOS-判断中英文混合的字符长度的两种方法
一,代码. - (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//第 ...
- php截取英语,php 截取中英文混合字符串的方法
php 截取中应为字符串,就不必再用substr或者mb_substr //截取想这样的字符串 a李三 利用ASCII /** * * 中英混合的字符串截取 * @param unknown_type ...
- PHP截取中英文混合字符串
<?php /*** 截取中英文混合字符串* @param $sourcestr 需要截取的字符串* @param $start 开始位置,字符位置,* @param $cutlength 结束 ...
最新文章
- 阿里云:国际化是云计算技术能力的照妖镜
- html中运行php脚本,php脚本在html文件中
- 在java web项目中编写自己的代码生成器
- 机器视觉:Asymmetry Problem in Computer Vision
- HTML5-WebSocket实现对服务器CPU实时监控
- [数分提高]2014-2015-2第8教学周第1次课 (2015-04-21)
- pip 删除安装包_Python中PIP的快速指南
- 科学家的假想-substr的妙用
- 一款纯css3实现的超炫动画背画特效
- 网页mp3提取器_用Python写一个酷狗音乐下载器!
- 智能手机收邮件之Mobile
- 了解计算机编码的一般特征,教招信息知识点:计算机编码的一般特征
- 【工具】获取窗口与控件信息
- 创业邦:谈谈 To B业务的机会
- java实现word(docx)在线编辑(word转html,html转word)——代码实现
- ECshop二次开发细节
- PHP 富文本内容中图片路径追加域名
- tablayout 滚动模式_Android底部导航栏(可滑动)----TabLayout+viewPager
- 增加tensor维度 torch
- 性格内向的人,是否适合做产品经理 ?
热门文章
- RDIFramework.NET(.NET快速信息化系统开发框架) Web版介绍
- Hadoop:MapReduce应用
- USB3.0、PCIe、PCI等各总线速度对比与介绍
- 系统架构设计师考查重点
- Python 入门之类的继承
- 基于微服务,打造共享开发平台
- jQuery实现简单的农场小游戏
- 运行java -jar xxxx.jar 报ConfigServletWebServerApplicationContext : Exception encountered during contex
- Android 学习之那些年我们遇到的BUG5:java.lang.IllegalArgumentException: You cannot start a load on a null Contex
- 【信号处理】基于小波变换的音频水印嵌入提取matlab源码