我用的是循环的方法,想不出来还有什么更好的方法了,在群里问了,大家都没话
按字节数取字符串,就是比如说做新闻网站,在前台一行要显示多少个字的时候,就用到了,新闻标题可能会包含中文字符或者英文字符,中文字符占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
如果是
@text = '0一二三四五六12345'
期望的结果是什么?
如果是@text = '0一二三四五六12345',
返回的要求是:0一二三四五
因为如果返回“0一二三四五六”,那就已经超出六个中文字的长度了