字符串中全角和半角的转化?

_空指针_ 2008-09-27 08:44:59
比如有字符串:
string1=“abcd我和你,abcd你和我,abcd你和我,abcd你和我,abcd你和我”;
string2=“asad,sdasd,asdasd,sdsds”;
我想截取半角下的前20个字符,该怎么办?也就是说在显示时输出的字符串占据的长度是一样的?
截取后的为:string2="asad,sdasd,asdasd,sd";
string1="abcd我和你,abcd你和我";
好像因为汉字是全角的,一个占两个字符
...全文
327 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
calmer18 2008-09-27
  • 打赏
  • 举报
回复
同2楼,还要考虑字体的,有些字体并不是两个半角宽度等与一个全角的宽度的。
而.NET也提供了一些测量的方法,比如Font.MeasureString 等
wdgphc 2008-09-27
  • 打赏
  • 举报
回复
        /// <summary>
/// 转全角的函数(SBC case)
/// </summary>
/// <param name="input">任意字符串</param>
/// <returns>全角字符串</returns>
///<remarks>
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
///</remarks>
public static string ToSBC(string input)
{
//半角转全角:
char[] c = input.ToCharArray();
for (int i = 0; i < c.Length; i++)
{
if (c[i] == 32)
{
c[i] = (char)12288;
continue;
}
if (c[i] < 127)
c[i] = (char)(c[i] + 65248);
}
return new string(c);
}


/**/
/// <summary>
/// 转半角的函数(DBC case)
/// </summary>
/// <param name="input">任意字符串</param>
/// <returns>半角字符串</returns>
///<remarks>
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
///</remarks>
public static string ToDBC(string input)
{
char[] c = input.ToCharArray();
for (int i = 0; i < c.Length; i++)
{
if (c[i] == 12288)
{
c[i] = (char)32;
continue;
}
if (c[i] > 65280 && c[i] < 65375)
c[i] = (char)(c[i] - 65248);
}
return new string(c);
}
怫悰 2008-09-27
  • 打赏
  • 举报
回复
public static string GetQiaoJiaoStringByNum(string sContent,int iNum)
{
//2004.10.31 Gzb 得到一句话的实际占用的“中文”字符的宽度
// 例如:中国2004 -->4个中文宽度 (6个字),实际上这个程序是取得固定中文宽度的缩略字符串
if(sContent==null || sContent==string.Empty || sContent.Length<iNum)
return sContent;

char[] cArray=sContent.ToCharArray();
int iAlreadyNum=0;
int iOkLenNum=0;
foreach (char cH in cArray)
{
if(iAlreadyNum < iNum * 2)
{
if(cH>128)
{
iAlreadyNum+=2;
}
else
iAlreadyNum++;
iOkLenNum++;
}
else
break;
}
sContent=sContent.Substring(0,iOkLenNum)+"...";
return sContent;
}
wuyi8808 2008-09-27
  • 打赏
  • 举报
回复
上面的是填空格的,截断的按同样的思路做。
wuyi8808 2008-09-27
  • 打赏
  • 举报
回复
  // 字符串工具
sealed class StrUtl
{
// 把一个“unicode字符串”格式化为全角字符占2个位置的“普通字符串”
// width<0 表示左对齐,右边填空格
// width>0 表示右对齐,左边填空格
public static string StrFormat(string s, int width)
{
Encoding code = Encoding.Default;
byte [] bs = code.GetBytes(s);
bool leftAlign = (width < 0 ? true : false);
if (width < 0) width = - width;
if (bs.Length >= width) return s;
if (leftAlign) return s.PadRight(width-bs.Length+s.Length);
return s.PadLeft(width-bs.Length+s.Length);
}
}
brallow 2008-09-27
  • 打赏
  • 举报
回复
你的这个要求本身不复杂,但问题是字符串的编码方式多种多样,识别起来总有误差。
如果你想达到显示时输出的效果的话有一个函数可以达到你的目的。
首先得到你要输出的窗口的Graphics对象,然后执行MeasureString()你就可以得到一个:SizeF类型的对象了。这个对象表示了这个字符串在这个Graphics上以指定的Font输出时所占的宽度和高度。
简介:这份资源是我以前偶然间在网上找到的一份前辈总结的很实用的java实例,有时间我就拿出来看看,不只是应用,算法的实现过程也很重要。我觉得这份文档对于java开发人员来说是很实用的,所以拿出来分享一下。 内容包括:Java的16进制与字符串的相互转换函数 JAVA时间格式化处理 ,将毫秒转化为日期, 文本的倒序输出 ,判断一个数字是奇数还是偶数 ,用Hibernate实现分页, 35选7彩票程序 ,获取GMT8时间, 文乱码转换 ,小标签 ,Big5字与Unicode的互换, 取得服务器当前的各种具体时间,用半角的特殊符号代替全角的特殊符号,数组和数组之间的转换代码,从资源文件里读取值的类,一个随机类,计算传入值是否星期六,为RootPaneContainer组件添加键盘事件,将数组转成字符串 在调试或记录日志时用到,转换文件大小,多线程的世界时钟,显示巴黎,罗马,上海时间, AWT界面,Java日期格式化及其使用例子,几个常用方法,判断字符是否属于文,异常处理类,去掉字符串重复的子字符串,将指定byte数组以16进制的形式打印到控制台,获得任意一个整数的阶乘,递归,拷贝一个目录或者文件到指定路径下,简单的txt转换xml,字母排序(A-Z)(先大写,后小写),列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤,字符串匹配的算法,写入日志。

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧