惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
F
Fortinet All Blogs
I
InfoQ
Jina AI
Jina AI
有赞技术团队
有赞技术团队
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
雷峰网
雷峰网
B
Blog RSS Feed
C
Check Point Blog
Y
Y Combinator Blog
博客园 - 聂微东
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
Engineering at Meta
Engineering at Meta
G
Google Developers Blog

博客园 - MichaeL

【转】单例模式的几种实现方式及其特点 Google Web Toolkit (GWT)是什么? 天下难事,必作于易;天下大事,必作于细。 [工具篇]eclipse 中设置 Java/JSP/JS/HTML/CSS 智能提示 [Liferay 学习笔记]PRUser 中的prUser.setGender("");方法找不到的原因 MessageFormat.format(arg0, arg1)的用途--多语处理 Eclipse Java 开发常见的虚拟内存设置及位置 用微软的Live Writer 离线编写 CNBLOG上的日志 [liferay 学习笔记]搭建liferay的开发环境 [Liferay 学习笔记]liferay portal 安装部署 单反全教程 [原创]HP DV2 1005AU 装机偶得 【原创】从AutoCAD中提取明细栏和标题栏中的数据 Ubuntu 8.04LTS 下中文输入法FCITX的安装与汉字显示方块的解决方法 [原创]偶遇Ubuntu 【原创】C#.Net 中枚举类型的数据在PropertyGrid控件中的显示中文描述 【原创】简单的XML文档读取与操作 【原创】实现Word模板文件中的BookMark允许多次填写修改(含代码) [原创]C#.Net 下的注册表操作(含代码)
【原创】C#.Net中对中英文混排的字符串按照指定宽度截取排版
MichaeL · 2008-06-27 · via 博客园 - MichaeL

 摘要:在C#.Net 这样的支持Unicode字符集的环境下,字符串处理时,英文、数字、汉字以及标点符号都是当着一个字符来看待的,但是英文、中文显示时所占宽度不一致,这样在需要按照指定宽度输出时就会遇到截取到的字符串显示出来长短参差不齐的。在网上看了些别人写的一些文章,没有找到自己想要的方式。下面我就给出C#.Net中中英文混排的字符串,如何来进行按照指定宽度来截取。  
      今天有个程序需要在一个固定表格中输出一些文字数据,由于表格的单元格是固定的,因此用户希望能够在单元个中按照指定的宽度输出数据,超过的字符在下一行紧接着输出。我想这个在其他好多地方都会有应用的场景的。
      由于C#.Net中String.Length获得的是字符数,SubString方法指定截取的起始位置也是指的Unicode字符数,但是我们这里需要输出的宽度用英文字符个数来指定,也就是说如果是英文那么就单元格中应该有10字符,如果是中文则应该有5个汉字。考虑到中文是不能将两个字符截断,如果前面有9个英文字符,后面紧接着是个中文的话,我们就只能将中文放在下一个子串中。
一、通常使用的字符串截取方法
     常用的直接用SubString取子串方法得到的效果。

    

二、我的字符串截取方法

        /// <summary>
        
/// 获取拆分后的字符串列表。
        
/// </summary>
        
/// <param name="mOrigianlString"></param>
        
/// <param name="subStringCharNumber"></param>
        
/// <returns></returns>

        private ArrayList GetSeparateSubString(string mOrigianlString, int subStringCharNumber)
        
{
            ArrayList resultList 
= new ArrayList();
            
string tempStr = mOrigianlString;
            
int charNumber = subStringCharNumber;
            
int totalCount = 0;
            
string mSubStr = "";
            
for (int i = 0; i < tempStr.Length; i++)
            
{
                
string mChar = tempStr.Substring(i, 1);
                
int byteCount = Encoding.Default.GetByteCount(mChar);//关键点判断字符所占的字节数

                
if (byteCount == 1)
                
{
                    totalCount
++;
                    mSubStr 
+= mChar;
                    
if (totalCount == charNumber || i == tempStr.Length - 1)
                    
{
                        resultList.Add(mSubStr);
                        totalCount 
= 0;
                        mSubStr 
= "";
                    }

                }

                
else if (byteCount > 1)
                
{

                    totalCount 
+= 2;
                    
if (totalCount > charNumber )
                    
{
                        resultList.Add(mSubStr);
                        
if (i == tempStr.Length - 1)
                        
{
                            mSubStr 
= mChar;
                            resultList.Add(mSubStr);
                        }

                        
else
                        
{
                            totalCount 
= 2;
                            mSubStr 
= mChar;
                        }

                    }

                    
else if (totalCount == charNumber)
                    
{
                        mSubStr 
+= mChar;
                        resultList.Add(mSubStr);
                        totalCount 
= 0;
                        mSubStr 
= "";
                    }

                    
else if (i == tempStr.Length - 1)
                    
{
                        mSubStr 
+= mChar;
                        resultList.Add(mSubStr);
                    }

                    
else
                    
{
                        mSubStr 
+= mChar;
                    }

                }

            }

            
return resultList;
        }

下图为新方法处理的结果: