C#中英文对齐
最近闲暇时间在做一个复制程序包更新文件的小工具,其中在生成txt说明文档时,需要两项内容:文件名和文件路径,为了美观,应当让txt文档看上去就好像有文件名和文件路径两列似的(如下图),即需要让文件名列左对齐,但由于文件名有的是中文的,有的是英文的,有的是中英混合的,这就牵扯到了中英文对齐的问题。
从字符串的长度来看,一个汉字的长度为1,但是一个汉字却是两位占位符的大小,假如字符串包含汉字,而将字符串的长度当做字符串的占位符来处理,那么是无法实现对齐的,因为这种处理方式将本是两个占位符的汉字按只占一个占位符进行处理的,而对齐是以占位大小为标准的。所以,要解决对齐问题,需要操作给定字符串的占位符,而操作占位符的关键就是解决汉字是两个占位符的问题。通过在网上查资料,有两种解决问题的办法(说明:两种方式及代码均为网上查找资料获得,全非原创,由于查找资料时发现,原资料被引用的很乱,分不清真正的原作者是哪个,所以也懒得给出链接,只是对解决方案进行了适当的说明)。
方案一:给定字符串,如此可获取此字符串的占位符,同时给定想要此字符串占用的占位符长度,那么不足长度用 ‘ ’ ‘*’ 等字符填充,代码如下
string result = str + new string(' ',length - Encoding.Default.GetBytes(str).Length);
其中,str为给定的字符串,length为想要str占用的占位符大小。
方案二:利用string的PadRight(int totalWidth)方法。该方法实现的功能是:返回一个新的字符串,该字符串通过在此字符串中的字符右侧填充空格来达到指定的长度,从而使这些字符左对齐。很明显,该方法是针对字符操作的,也就是本来是两个占位符的汉字,按字符来处理时,长度却为1,所以当填充空格时,源字符串中每有一个汉字,就多填充了一个,所以下面的放大进行了如下处理:判断字符串中汉字的个数,然后使用PadRight方法时总长度减去汉字的个数,即减去多加的空格数。代码如下:
Encoding coding = Encoding.Default; int count = 0; foreach (char ch in str.ToCharArray()) { int byteCount = coding.GetByteCount(ch.ToString()); if (byteCount == 2) count++; } string result = str.PadRight(length - count);
这样也就实现了中英文对齐的效果。
问题到这里也就应该结束了。但是在我的程序中,我尝试了很多次就是不行,无法实现对齐。于是我另启动了一个控制台程序进行测试,发现上述方法能实现我想要的功能,但在我的程序里为什么就不行呢。排除不是代码的问题,我想到可能是我的显示控件的问题。我开始用的是DevExpress的memoEdit控件,于是我将控件换成WinForm的RichTextBox控件,重新运行一下,发现达到了我想要的效果,即如上图所示。