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#判断字符串的显示宽度的更多相关文章

  1. C# 截取中英文混合字符串分行显示宽度相同

    /// <summary>        /// 截取方法名显示宽度        /// </summary>        /// <param name=" ...

  2. Js获取字符串的显示宽度/高度

    重点:1.在H5页面,文字大小单位为rem2.不同的font-family,文字的宽度不一样3.文字宽度同时受font-size和font-family影响 思路:在页面动态创建一个节点,设置节点的f ...

  3. css判断不同分辨率显示不同宽度布局实现自适应宽度

    一.CSS DIV网页布局中当分辨率小于等于1024px(像素)时,DIV布局对象显示1000px宽度,当分辨率大于1024px时候显示1200px宽度等需求.使用CSS实现改变浏览器显示宽度从而实现 ...

  4. CSS判断不同分辨率显示不同宽度布局CSS3技术支持IE6到IE8

    CSS判断不同分辨率浏览器(显示屏幕)显示不同宽度布局CSS3技术支持IE6到IE8.将用到css3 @media样式进行判断,但IE9以下版本不支持CSS3技术,这里DIVCSS5给大家介绍通过JS ...

  5. SQL判断字符串里不包含字母

    Oracle: 方法一:通过To_Number 函数异常来判断,因为这个函数在转换不成功的时候是报错,所以只能用存储过程包装起来. CREATE OR REPLACE FUNCTION Is_Numb ...

  6. shell 判断字符串是否为数字

    本篇文章主要介绍了"shell 判断字符串是否为数字",主要涉及到shell 判断字符串是否为数字方面的内容,对于shell 判断字符串是否为数字感兴趣的同学可以参考一下. #!/ ...

  7. 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...

  8. element-ui select组件中复选时以字符串形式显示

    我使用的element-ui的版本是1.4.13. 如上图所示,使用el-select组件,要实现可搜索.可复选.可创建条目时,展示样式是如上图所示,输入框的高度会撑开,影响页面布局,按照产品的需求, ...

  9. C#路径的八种相关操作,判断字符串是否为路径等

    原文:C#路径的八种相关操作,判断字符串是否为路径等 1.判定一个给定的C#路径是否有效,合法 通过Path.GetInvalidPathChars或Path.GetInvalidFileNameCh ...

  10. C#如何测量字符串的高度宽度和精确取得字符串的高度宽度

    C#如何测量字符串的高度宽度和精确取得字符串的高度宽度 因为MFC中CDC有GetTextExtent()可以获得字符串的高度宽度 像素单位,所以自然想到c#的GDI+的MeasureString,这 ...

随机推荐

  1. 【译】Visual Studio 2022 中的 Web API 开发

    在 Visual Studio 2022 中,Web 开发人员的主要场景之一是使用 ASP.NET Core 创建 Web API.在 Visual Studio 2022 17.6 的最新预览版中, ...

  2. Blazor前后端框架Known-V1.2.7

    V1.2.7 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...

  3. Go中 net/http 使用

    转载请注明出处: net/http是Go语言标准库中的一个包,提供了实现HTTP客户端和服务器的功能.它使得编写基于HTTP协议的Web应用程序变得简单和方便. net/http包的主要用途包括: 实 ...

  4. Spring Boot Starter 剖析与实践

    引言 对于 Java 开发人员来说,Spring 框架几乎是必不可少的.它是一个广泛用于开发企业应用程序的开源轻量级框架.近几年,Spring Boot 在传统 Spring 框架的基础上应运而生,不 ...

  5. 掌握Spring条件装配的秘密武器

    本文分享自华为云社区<Spring高手之路9--掌握Spring条件装配的秘密武器>,作者:砖业洋__. 在Spring框架中,条件装配是一个强大的功能,可以帮助我们更好地管理和控制Bea ...

  6. appium环境搭建python

    python appium环境搭建   appium是什么? 1,appium是开源的移动端自动化测试框架:2,appium可以测试原生的.混合的.以及移动端的web项目:3,appium可以测试io ...

  7. css使用背景灵活展示雪碧图

    雪碧图是把各种小图标集合在一起的png图片,通过background-position来展示雪碧图中不同位置的小图标,比如以下图片,在项目中要用到的小图标很多,如果每一个图标都作为一个png或者jpg ...

  8. 《SQL与数据库基础》10. 存储引擎

    目录 存储引擎 MySQL体系结构 存储引擎简介 三种经典存储引擎 InnoDB 逻辑存储结构 MyISAM Memory 区别及特点 存储引擎选择 本文以 MySQL 为例 存储引擎 MySQL体系 ...

  9. 《CTFshow-Web入门》04. Web 31~40

    @ 目录 web31 题解 原理 web32 题解 原理 web33 题解 web34 题解 web35 题解 web36 题解 web37 题解 原理 web38 题解 原理 web39 题解 we ...

  10. ECharts图表动态修改series显示隐藏

    目录 1.前言 2.思路 3.实现 1.前言 最近做的大数据平台,里面很多地方用到了ECharts,其中有个功能,要求将图表分组,根据用户选择的组,来确定ECharts要显示那些线条和柱子,也就是动态 ...