詳解C#如何判斷字符串的顯示寬度
起因
公司有一個(gè)使用項(xiàng)目使用HTML轉(zhuǎn)換為PDF,其中有一個(gè)表格,表格的最后一列中的單元格,其字符串超長(zhǎng)后會(huì)被丟棄,而不是換行到下一行展示(HtmlToPdf渲染引擎導(dǎo)致的,沒(méi)辦法更改)
解決方案
根據(jù)字符串長(zhǎng)度手動(dòng)添加<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; }
出現(xiàn)了一個(gè)BUG
當(dāng)原始內(nèi)容中存在中文時(shí),中文字符的顯示寬度大于英文字符的寬度,按照字符串中的字符數(shù)進(jìn)行處理,并不準(zhǔn)確
/* * 中文:中文<br/>CD * 英文:AB<br/>CD */
原因分析
在文字的顯示中,有全角和半角的區(qū)別
全角:指一個(gè)字符占用兩個(gè)標(biāo)準(zhǔn)字符位置的狀態(tài)。
半角:指一個(gè)字符占用一個(gè)標(biāo)準(zhǔn)字符位置的狀態(tài)。
嘗試解決
字符編碼:最早的字符編碼為Ascii碼,只考慮了英文語(yǔ)種使用者,后來(lái)隨著計(jì)算機(jī)的普及,有了其他編碼,比如GB2312、UTF8等,不止包含英文的字符編碼,但是這些編碼都對(duì)Ascii碼進(jìn)行了兼容
沒(méi)有細(xì)心求證的結(jié)論:Ascii碼對(duì)應(yīng)的是半角,中文擴(kuò)展部分是全角展示,半角顯示寬度為全角的一半(這結(jié)論是我猜的,沒(méi)有求證,如果不對(duì)還請(qǐng)?zhí)岢雠u(píng)指正)
通過(guò)上面猜測(cè)的結(jié)論,可以先對(duì)每個(gè)字符判斷是不是Ascii字符來(lái)決定當(dāng)前是全角還是半角
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])){ // 半角占一個(gè)顯示寬度 now +=1; }else{ // 全角占兩個(gè)顯示寬度 now +=2; }; if (now>inserAtDisplayWidth) { return i; } } return -1; }
通過(guò)對(duì)字符的判斷,更加準(zhǔn)確的匹配了分隔的位置,既避免了無(wú)效的空白區(qū)域,又避免了過(guò)長(zhǎng)的字符串溢出導(dǎo)致看不到內(nèi)容
/* * AB<br/>CD * 中<br/>文CD */
到此這篇關(guān)于詳解C#如何判斷字符串的顯示寬度的文章就介紹到這了,更多相關(guān)C#判斷字符串顯示寬度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#后臺(tái)線程訪問(wèn)前臺(tái)控件并顯示信息示例
這篇文章主要介紹了c#后臺(tái)線程訪問(wèn)前臺(tái)控件并顯示信息示例,需要的朋友可以參考下2014-03-03C#實(shí)現(xiàn)基于ffmpeg加虹軟的人臉識(shí)別的示例
本篇文章主要介紹了C#實(shí)現(xiàn)基于ffmpeg加虹軟的人臉識(shí)別的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10C#如何打開(kāi)選擇文件對(duì)話框和選擇目錄對(duì)話框
這篇文章主要介紹了C#如何打開(kāi)選擇文件對(duì)話框和選擇目錄對(duì)話框問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法,可實(shí)現(xiàn)將bmp格式位圖轉(zhuǎn)換成ico格式圖標(biāo)的功能,需要的朋友可以參考下2015-06-06