云中客

梦想有多大,就能走多远

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

   可能你会遇到这样的情况,向Oracle中的VARCHAR2类型的字段存入超过长度的字符串时会报错!VARCHAR2类型的字段的长度是字符串的字节长度,不是字符串长度。这两个长度是有区别的:

  1.         在全是半角的情况下,两者是相等的。如:string s=“123456789”;s.length为9,字节长度是9.
  2.         在全是全角的情况下,字节长度=字符串长度*2;如 string s="123456789";s.length为9,字节长度是18.
  3.         特色情况:既有全角,又有半角的怎么办。如  string s=“ ~ 123456789■123456789■12345”;s.length为26,字节长度是44(“~”两边有两个空格).
那如何去判断字符串的字节长度呢?
    首先,要弄清楚什么是半角,什么是全角。
  • 全角是指用二个字节来表示的一个字符。
  • 半角是用一个字节来表示的一个字符。
    这样的话我们就可以用string.length 和System.text.Encoding.Default.GetByteCount来判断。
(其中string.length表示字符串的字符数,System.text.Encoding.Default.GetByteCount表示字符串的字节数)
判断半角如下:
半角判断代码
1 if (checkString.Length == Encoding.Default.GetByteCount(checkString))
2 {
3 return true;
4 }
5 else
6 {
7 return false;
8 }

全角如下:

全角判断代码
1 if (2 * checkString.Length ==Encoding.Default.GetByteCount(checkString))
2 {
3 return true;
4 }
5 else
6 {
7 return false;
8 }

在具体应用时可以将这些写成一个方法:bool IsHalfangle(string i_str){//加入判断半角的代码}。

然后就是一个一个字符来判断了

获取指定字节长度的字符串
 1             int count = 0;
2 int MaxLength=50;
3 StringBuilder result = new StringBuilder();
4 foreach (char str in i_filename)
5 {
6 if (IsHalfangle(str.ToString()))
7 {
8 count++;
9 }
10 else
11 count = count + 2;
12
13 if (count > MaxLength)
14 {
15 break;
16 }
17 else
18 {
19 result.Append(str.ToString());
20 }
21 }
22 return result.ToString();

  之所以用stringbuilder 是因为如果直接用byte数组,如果截取奇数个字节,而某个字符刚好为全角,刚好取了他的一半,则恢复的时候就会出现异常字符。

现在取到的就是我们想要的了,存入数据库就不会报错了。

posted on 2011-09-05 11:53  走遍江湖  阅读(1389)  评论(0编辑  收藏  举报