日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#判断字符串的显示宽度

發布時間:2023/11/8 C# 47 coder
生活随笔 收集整理的這篇文章主要介紹了 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#判断字符串的显示宽度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。