可能你会遇到这样的情况,向Oracle中的VARCHAR2类型的字段存入超过长度的字符串时会报错!VARCHAR2类型的字段的长度是字符串的字节长度,不是字符串长度。这两个长度是有区别的:
- 在全是半角的情况下,两者是相等的。如:string s=“123456789”;s.length为9,字节长度是9.
- 在全是全角的情况下,字节长度=字符串长度*2;如 string s="123456789";s.length为9,字节长度是18.
- 特色情况:既有全角,又有半角的怎么办。如 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数组,如果截取奇数个字节,而某个字符刚好为全角,刚好取了他的一半,则恢复的时候就会出现异常字符。
现在取到的就是我们想要的了,存入数据库就不会报错了。
每天成就一小步,积累下来就是一大步。
转发本文请注明出处,谢谢您的阅读与分享!