C#判断字符串的显示宽度
生活随笔
收集整理的這篇文章主要介紹了
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#判断字符串的显示宽度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 既是解释型语言,也是编译型
- 下一篇: c# char unsigned_dll