C#判断字符串的显示宽度
C#判断字符串的显示宽度
起因:
公司有一个使用项目使用HTML转换为PDF,其中有一个表格,表格的最后一列中的单元格,其字符串超长后会被丢弃,而不是换行到下一行展示(HtmlToPdf渲染引擎导致的,没办法更改)
解决方案:
根据字符串长度手动添加<br/>换行
var source = "ABCD";
if (GetLength(source)>2)
{
source = source.Insert(2,"<br/>");
}
Console.WriteLine(source);
// 输出AB<br/>CD
int GetLength(string src)
{
return src.Length;
}
出现了一个BUG:
当原始内容中存在中文时,中文字符的显示宽度大于英文字符的宽度,按照字符串中的字符数进行处理,并不准确
/*
* 中文:中文<br/>CD
* 英文:AB<br/>CD
*/
原因分析:
在文字的显示中,有全角和半角的区别
全角:指一个字符占用两个标准字符位置的状态。
半角:指一个字符占用一个标准字符位置的状态。
尝试解决:
字符编码:最早的字符编码为Ascii码,只考虑了英文语种使用者,后来随着计算机的普及,有了其他编码,比如GB2312、UTF8等,不止包含英文的字符编码,但是这些编码都对Ascii码进行了兼容
没有细心求证的结论:Ascii码对应的是半角,中文扩展部分是全角展示,半角显示宽度为全角的一半(这结论是我猜的,没有求证,如果不对还请提出批评指正)
通过上面猜测的结论,可以先对每个字符判断是不是Ascii字符来决定当前是全角还是半角
var source = "ABCD";
var index =InserAtDisplayWidth(2,source);
if (index!=-1)
{
source = source.Insert(index,"<br/>");
}
// AB<br/>CD
Console.WriteLine(source);
var source2 = "中文CD";
var index2 =InserAtDisplayWidth(2,source2);
if (index2!=-1)
{
source2 = source2.Insert(index2,"<br/>");
}
// 中<br/>文CD
Console.WriteLine(source2);
int InserAtDisplayWidth(int inserAtDisplayWidth, string source){
int now =0;
for (int i = 0; i < source.Length; i++)
{
if( char.IsAscii(source[i])){
// 半角占一个显示宽度
now +=1;
}else{
// 全角占两个显示宽度
now +=2;
};
if (now>inserAtDisplayWidth)
{
return i;
}
}
return -1;
}
通过对字符的判断,更加准确的匹配了分隔的位置,既避免了无效的空白区域,又避免了过长的字符串溢出导致看不到内容
/*
* AB<br/>CD
* 中<br/>文CD
*/
C#判断字符串的显示宽度的更多相关文章
- C# 截取中英文混合字符串分行显示宽度相同
/// <summary> /// 截取方法名显示宽度 /// </summary> /// <param name=" ...
- Js获取字符串的显示宽度/高度
重点:1.在H5页面,文字大小单位为rem2.不同的font-family,文字的宽度不一样3.文字宽度同时受font-size和font-family影响 思路:在页面动态创建一个节点,设置节点的f ...
- css判断不同分辨率显示不同宽度布局实现自适应宽度
一.CSS DIV网页布局中当分辨率小于等于1024px(像素)时,DIV布局对象显示1000px宽度,当分辨率大于1024px时候显示1200px宽度等需求.使用CSS实现改变浏览器显示宽度从而实现 ...
- CSS判断不同分辨率显示不同宽度布局CSS3技术支持IE6到IE8
CSS判断不同分辨率浏览器(显示屏幕)显示不同宽度布局CSS3技术支持IE6到IE8.将用到css3 @media样式进行判断,但IE9以下版本不支持CSS3技术,这里DIVCSS5给大家介绍通过JS ...
- SQL判断字符串里不包含字母
Oracle: 方法一:通过To_Number 函数异常来判断,因为这个函数在转换不成功的时候是报错,所以只能用存储过程包装起来. CREATE OR REPLACE FUNCTION Is_Numb ...
- shell 判断字符串是否为数字
本篇文章主要介绍了"shell 判断字符串是否为数字",主要涉及到shell 判断字符串是否为数字方面的内容,对于shell 判断字符串是否为数字感兴趣的同学可以参考一下. #!/ ...
- 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
- element-ui select组件中复选时以字符串形式显示
我使用的element-ui的版本是1.4.13. 如上图所示,使用el-select组件,要实现可搜索.可复选.可创建条目时,展示样式是如上图所示,输入框的高度会撑开,影响页面布局,按照产品的需求, ...
- C#路径的八种相关操作,判断字符串是否为路径等
原文:C#路径的八种相关操作,判断字符串是否为路径等 1.判定一个给定的C#路径是否有效,合法 通过Path.GetInvalidPathChars或Path.GetInvalidFileNameCh ...
- C#如何测量字符串的高度宽度和精确取得字符串的高度宽度
C#如何测量字符串的高度宽度和精确取得字符串的高度宽度 因为MFC中CDC有GetTextExtent()可以获得字符串的高度宽度 像素单位,所以自然想到c#的GDI+的MeasureString,这 ...
随机推荐
- curl 调用url时带有&符号被截断
转载请注明出处: 用curl命令在服务器上调试接口时,一直调试不通,执行如下: 在用curl 执行之后,返回了一个 作业id [ 1 ] 23926 ; 并打印出了 调用执行的url,发现 真正执行的 ...
- 「Python实用秘技16」快速提取字体子集
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第16 ...
- NodeJS:安装CNPM
安装命令 npm install -g cnpm --registry=https://registry.npm.taobao.org 使用命令 cnpm install [name] 参考连接 ht ...
- 大二暑期实习记录(一):处理组件绑定数据错误(数组解构,map()方法)
好家伙,搬砖 今天在做组件迁移(从一个旧平台迁移到一个新平台)的时候,发现了一些小小的问题: 1.错误描述: 在穿梭框组件中,使用"节点配置"方法添加数据的时候,左测数据选择框 ...
- MyBatis-Plus批量插入方法saveBatch
1. saveBatch能否提高插入的效率? 先说结论,saveBatch()方法也是一条一条的插入,也就是说它会产生多条insert语句,而不是一条insert语句,所以它不是真正的批量插入,更不能 ...
- c# 如何将程序加密隐藏?
下面将介绍如何通过LiteDB将自己的程序进行加密,首先介绍一下LiteDB. LiteDB LiteDB是一个轻量级的嵌入式数据库,它是用C#编写的,适用于.NET平台.它的设计目标是提供一个简单易 ...
- 让 GPT-4 来修复 Golang “数据竞争”问题(续) - 每天5分钟玩转 GPT 编程系列(7)
目录 1. 我以为 2. 阴魂不散的"数据竞争"问题 3. 老规矩,关门放 GPT-4 3.1 复现问题 3.2 让 GPT-4 写一个单元测试 3.3 修复 Wait() 中的逻 ...
- 历时数月钻研推流/对比各种流媒体服务程序/PK总结
1 前言 大量测试下来,网页显示视频流实时性从高到低依次是 webrtc > ws-flv > flv > hls.播放器打开rtsp/rtmp视频流实时性由具体的播放器控制,比如缓 ...
- [超详细] GraalVM打包含有JNI的本地镜像
GraalVM 是一种高性能.多语言通用虚拟机和编译器技术.它由 Oracle 开发并开源,旨在为不同的编程语言和应用场景提供统一的运行时环境和编译器平台.以下是 GraalVM 的一些主要特点和功能 ...
- U268603 I Hate This Tree 题解
传送门 一道纯粹的码力 + 卡常题. 前置 矩阵乘法,线段树. 分析 线段树存矩阵. 构造迭代矩阵: \[\begin{pmatrix}f_i&f_{i-1}\end{pmatrix}\tim ...