紧急求救:关于中英文结合在一起的截取串的问题

sonryou 2003-09-29 10:07:19
要实现从数据库中读取数据,生成每行是固定长度的文件,
再次读取的时候,需要指定位置。
商品cd(10)商品名称(20)供应商名(30)标志位(1)
因为每个汉字占两位,如果数据库中的商品名称超过20位,则需要截取前20位,(这20位中可能是中英位混合在一起的)怎么解决呢?
...全文
24 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sonryou 2003-09-29
  • 打赏
  • 举报
回复
要实现从数据库中读取数据,生成每行是固定长度的文件,
再次读取的时候,需要指定位置
supercdz 2003-09-29
  • 打赏
  • 举报
回复
比如:中国abc中国,截取8位,结果是:中国abc

我觉得这应该是理想的结果,为什么要留半个汉字呢?
sonryou 2003-09-29
  • 打赏
  • 举报
回复
up
snakeyin 2003-09-29
  • 打赏
  • 举报
回复
建議你去看一下關於unicode方面的資料.
然後寫一個此方面的函數給大家用.

sonryou 2003-09-29
  • 打赏
  • 举报
回复
测试结果不正确。
比如:中国abc中国,截取8位,结果是:中国abc
temp=str1.Substring(0,i-1) 不能截取出半个汉字来
还有别的解决办法吗?
sonryou 2003-09-29
  • 打赏
  • 举报
回复
我先测试一下。。。
xhan2000 2003-09-29
  • 打赏
  • 举报
回复
public static string CutLen(string str,double max_len,double keep_len,string end_str,bool singleline)
{
string temp="出错";
string str1=str;
if(singleline)
{
str1=str1.Replace("\r","").Replace("\n","");
}
if(CnLen(str1)<=max_len)
{
return str1;
}
for(int i=1;i<=str1.Length;i++)
{
if(CnLen(str1.Substring(0,i))>keep_len)
{
temp=str1.Substring(0,i-1)+end_str;
break;
}
}
return temp;
}
xhan2000 2003-09-29
  • 打赏
  • 举报
回复
因为中文占两个位置

所以需要逐个字符判断是否中文
public static int EnLen(string str)
{
byte [] Mybyte=System.Text.Encoding.Default.GetBytes(str);
return Mybyte.Length;
}

EnLen("中国123")=7

sonryou 2003-09-29
  • 打赏
  • 举报
回复
up
wang478 2003-09-29
  • 打赏
  • 举报
回复

我觉得你可以采用xhan2000所说的方法截取,对于“中国abc中国”来说你应该取得值也只能为“中国abc”了,虽然长度只有7(n)位,但你可以加20-n个固定符号来补足到20位呀。
ReinhardCao 2003-09-29
  • 打赏
  • 举报
回复
如果是的话我大概明白你的意思了,因为我刚看到另外一贴:http://expert.csdn.net/Expert/topic/2311/2311194.xml?temp=.3079645
上面的问题和你的很象,上面有个方法的确可以获得半个中文,但如果在其后追加文字会显示不出来。所以我修改了一下。

Dim ba() As Byte = System.Text.Encoding.Default.GetBytes("中国人民")
ReDim Preserve ba(4)
If ba(ba.Length - 1) > 128 Then '我忘记中文是从多少开始了,暂且当它是从129开始吧
ba(ba.Length - 1) = Asc(".") '用“.”代替那半个中文的位置
End If
dim s as string =System.Text.Encoding.Default.GetString(ba)
s = s & "abc"
msgbox(s)

显示的是"中国.abc"

sonryou 2003-09-29
  • 打赏
  • 举报
回复
要实现从数据库中读取数据,生成每行是固定长度的文件,
再次读取的时候,需要指定位置
商品cd(10)商品名称(20)供应商名(30)标志位(1)
AA=商品cd(10)
BB=商品名称(20)
CC=供应商名(30)
DD=标志位(1)
因为每个汉字占两位,如果数据库中的商品名称超过20位,则需要截取前20位,(这20位中可能是中英位混合在一起的)然后赋值给BB
最后 AA & BB & CC && DD 的长度始终为41位
ReinhardCao 2003-09-29
  • 打赏
  • 举报
回复
越看越糊涂了,楼主到底是要获得半个汉字还是要显示半个汉字啊?
sonryou 2003-09-29
  • 打赏
  • 举报
回复
UP
树莓派 2003-09-29
  • 打赏
  • 举报
回复
记得以前len()中文也算一个的。所以,以前len(中国abc中国)=7

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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