您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



按字节数取字符串
狼子 发表于 2008-2-11 8:40:00 阅读全文 | 回复(2) | 引用通告 | 编辑

我用的是循环的方法,想不出来还有什么更好的方法了,在群里问了,大家都没话

按字节数取字符串,就是比如说做新闻网站,在前台一行要显示多少个字的时候,就用到了,新闻标题可能会包含中文字符或者英文字符,中文字符占2个字节,英文字符占1个字节,在tsql里、在asp里、在c#里,取len或者Length时,中文字符和英文字符都是不分开的

tsql里,print('中华人民共和国')的值是7

在C#里,"中华人民共和国".Length的值,也是7,因为对string 类型,C#提供的字符类型是Unicode字符集,一个Unicode 的标准字符长度为16 位,取Length的时候,C#是先把它转成了GB的格式的,比如“中”是20013

如果是截子字符串呢,left、substring、right等等方法,都是按对应的字符取的,pb里有分left取单字符的,和leftW取双字符的,也没有混合取的

在C#里,经常用System.Text.Encoding.Default.GetByteCount(strValue) != strValue.Length判断一个字符串是不是中英文混合的,所以我就想到用下面的方法,这个是在tsql里的代码

declare @text varchar(200), @titleLen int
select @text = '一二三四五12345', @titleLen = 6
print @text
print '总字节数:' + convert( varchar(10), datalength(@text) )
if datalength(@text) > @titleLen * 2
   begin
     print '多于六个中文字'
     print dbo.a_GetTitleInLen(@text, @titleLen)
   end
else
   begin
     print '不够六个中文字'
     select @text
   end

用到的自定义函数是这个

create  function dbo.a_GetTitleInLen ( @text varchar(200), @titleLen int )
returns varchar(200)
as
begin
   --截取@text的前@titleLen个中文字符长度
   while ( datalength(@text) > @titleLen * 2 )
     begin
       select @text = left(@text, len(@text) - 1)
     end
   return ( @text )
end

Re:按字节数取字符串
acen发表评论于2008-3-8 20:41:00 个人主页 | 引用 | 返回 | 删除 | 回复

如果是

@text = '0一二三四五六12345'

期望的结果是什么?

Re:按字节数取字符串
mountain315发表评论于2008-3-13 15:54:00 个人主页 | 引用 | 返回 | 删除 | 回复

如果是@text = '0一二三四五六12345',

返回的要求是:0一二三四五

因为如果返回“0一二三四五六”,那就已经超出六个中文字的长度了

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.