詳解C#如何判斷字符串的顯示寬度
起因
公司有一個使用項目使用HTML轉(zhuǎn)換為PDF,其中有一個表格,表格的最后一列中的單元格,其字符串超長后會被丟棄,而不是換行到下一行展示(HtmlToPdf渲染引擎導(dǎo)致的,沒辦法更改)
解決方案
根據(jù)字符串長度手動添加<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)了一個BUG
當(dāng)原始內(nèi)容中存在中文時,中文字符的顯示寬度大于英文字符的寬度,按照字符串中的字符數(shù)進行處理,并不準確
/* * 中文:中文<br/>CD * 英文:AB<br/>CD */
原因分析
在文字的顯示中,有全角和半角的區(qū)別
全角:指一個字符占用兩個標準字符位置的狀態(tài)。
半角:指一個字符占用一個標準字符位置的狀態(tài)。
嘗試解決
字符編碼:最早的字符編碼為Ascii碼,只考慮了英文語種使用者,后來隨著計算機的普及,有了其他編碼,比如GB2312、UTF8等,不止包含英文的字符編碼,但是這些編碼都對Ascii碼進行了兼容
沒有細心求證的結(jié)論:Ascii碼對應(yīng)的是半角,中文擴展部分是全角展示,半角顯示寬度為全角的一半(這結(jié)論是我猜的,沒有求證,如果不對還請?zhí)岢雠u指正)
通過上面猜測的結(jié)論,可以先對每個字符判斷是不是Ascii字符來決定當(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])){
// 半角占一個顯示寬度
now +=1;
}else{
// 全角占兩個顯示寬度
now +=2;
};
if (now>inserAtDisplayWidth)
{
return i;
}
}
return -1;
}通過對字符的判斷,更加準確的匹配了分隔的位置,既避免了無效的空白區(qū)域,又避免了過長的字符串溢出導(dǎo)致看不到內(nèi)容
/* * AB<br/>CD * 中<br/>文CD */
到此這篇關(guān)于詳解C#如何判斷字符串的顯示寬度的文章就介紹到這了,更多相關(guān)C#判斷字符串顯示寬度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

