详解C#如何判断字符串的显示宽度

 更新时间:2023年11月08日 10:33:36   作者:吴俊城  
这篇文章主要为大家详细介绍了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#判断字符串显示宽度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Unity3D使用UGUI开发原生虚拟摇杆

    Unity3D使用UGUI开发原生虚拟摇杆

    这篇文章主要为大家详细介绍了Unity3D使用UGUI开发原生虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C# 递归查找树状目录实现方法

    C# 递归查找树状目录实现方法

    这篇文章主要介绍了C# 递归查找树状目录实现方法,需要的朋友可以参考下
    2014-02-02
  • C# DataGridView添加新行的2个方法

    C# DataGridView添加新行的2个方法

    DataGridView控件在实际应用中非常实用,特别需要表格显示数据时。
    2013-03-03
  • Chrome Visual Studio 2005下的编译过程

    Chrome Visual Studio 2005下的编译过程

    研究Chrome ,首先得把它编译出来,这对于后续的代码分析和阅读有很大的帮助,想想自己编译出一个 Chrome 浏览器来使用,那是一件很炫的事情。
    2009-07-07
  • 基于Unity3D实现3D照片墙效果

    基于Unity3D实现3D照片墙效果

    Unity3D不仅仅可以开发游戏,还有非常多的开发方向。本文就将用Unity3D制作出一个3D照片墙的效果,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-03-03
  • unity 鼠标悬停事件操作

    unity 鼠标悬停事件操作

    这篇文章主要介绍了unity 鼠标悬停事件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#将异步改成同步方法示例

    C#将异步改成同步方法示例

    这篇文章主要为大家介绍了C#将异步改成同步方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • C#中几个未知的Visual Studio编码技巧分享

    C#中几个未知的Visual Studio编码技巧分享

    用了多年的Visual Studio,今天才发现这个编码技巧,真是惭愧,分享出来,算是抛砖引玉吧,需要的朋友可以参考下
    2012-11-11
  • C# CefSharp 根据输入日期段自动选择日期的操作代码

    C# CefSharp 根据输入日期段自动选择日期的操作代码

    这篇文章主要介绍了C# CefSharp 根据输入日期段自动选择日期的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • C#定时器组件FluentScheduler用法

    C#定时器组件FluentScheduler用法

    这篇文章介绍了C#定时器插件FluentScheduler的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论