c# char 的问题

作者&投稿:璩夜 (若有异议请与网页底部的电邮联系)
C#中的char问题~

“汉字占两个字节”是90年代初只有gb2312编码时的提法。这个说法已经不对了
在utf8下汉字占3个以上字节。utf16下汉字占2、4个等多个字节。
忘记这个说法,记住一个“字符”可以占多个字节。具体几个字节因编码而定。

char是C#的字符,C#也采用旧版的utf16编码,每个字符固定2个字节。但字节多少不暴露在C#层面,输出存储时才考虑占的字节数。
'c', '你' 都是一个字符,也都占2个字节,每个char只能赋值一个字符。

C#的char类型跟C语言不同。它是16位的,5个字母也占10个字节。
看看微软的解释:
char 关键字用于声明下表所示范围内的 Unicode 字符。Unicode 字符是 16 位字符,用于表示世界上多数已知的书面语言。
类型 范围 大小 .NET Framework 类型
char U+0000 到 U+ffff 16 位 Unicode 字符 System.Char


char char1 = 'Z'; // Character literal
char char2 = '\x0058'; // Hexadecimal
char char3 = (char)88; // Cast from integral type
char char4 = '\u0058'; // Unicode

首先必须明白下面三点:
1、当整型数执行“+”号操作意味着数学中的加法。
2、当一个string类型和别的类型执行“+”号操作意味着字符串的连接。
3、“+”运算符按照从左至右的顺序执行。

下面分析:
string str=str1+str2+str3;
1、先运算str1+str2,由于str1和str2都属字符型,字符型相加就是Unicode码值的相加。(实际上,‘一’的Unicode码为19968 ,汉字‘二’的Unicode码为20108 )结果得40076。
2、值40076再与后面的字符串连接。

这种问题的解决方法:
string str=str1.ToString()+str2.ToString()+str3; //将字符转换为字符串

你前面的str1 + str2 是按照整型计算的(str1,str2的Unicode码) 后面的str1 + str2的结果+str3是按照字符串计算的(str1 + str2结果的字符串类型),给你个例子你就明白了

private void button1_Click(object sender, EventArgs e)
{
char str1 = '一';//19968 '一'的Unicode码
char str2 = '二';//20108 '二'的Unicode码
string str3 = "三四五";
string a = str1 + str2 + str3;
string b = ((int)str1 + (int)str2).ToString() + str3;//a与b等价
string c = str1.ToString() + str2.ToString() + str3;
MessageBox.Show(string.Format("a:{0}\r\nb:{1}\r\nc:{2}", a, b, c));
}


卓尼县19750234141: C#中的char问题 -
仁砖衡博: “汉字占两个字节”是90年代初只有gb2312编码时的提法.这个说法已经不对了 在utf8下汉字占3个以上字节.utf16下汉字占2、4个等多个字节.忘记这个说法,记住一个“字符”可以占多个字节.具体几个字节因编码而定.char是C#的字符,C#也采用旧版的utf16编码,每个字符固定2个字节.但字节多少不暴露在C#层面,输出存储时才考虑占的字节数.'c', '你' 都是一个字符,也都占2个字节,每个char只能赋值一个字符.

卓尼县19750234141: C#中的char问题请帮忙解决!!! -
仁砖衡博: code=(char)('A'+'5')'A'+'5' 不是 "A5"而是把他们的ANSI 码加起来对 char型的操作都是对他们的ANSI 操作

卓尼县19750234141: c# char的奇怪问题 -
仁砖衡博: c变量没有赋值不能直接用,可以这样定义就行了:char c='';如果还不行加上:Console.Write("{0}", c.ToString());也可以这样:static void m6(int i) { char c; if (i == 1) {c = 'a';Console.Write("{0}", c); } }

卓尼县19750234141: C#中:Char是个结构还是个类? -
仁砖衡博: 第一个问题:Char是个结构体 第二个问题:答案是准确的 请看以下解释:Char是结构体在VS里面可以很容易的看到,为什么C#中用Unicode,因为C#中的字符操作类有String/StringBuilder,而StringBuilder是对String的操作的优化操作,String是静态类,所以可以直接赋值,其实用“”引起来的值是 一个字符数组char[],所以对String的操作都是对char[]数据的操作,C#string可以包含任何的字符为了兼容性所以用Unicode

卓尼县19750234141: C#中char类型 数据 -
仁砖衡博: 因为C#函数是没有问题的;根据你给出的2个表达式,前面是一样的,后面不一样, 分别为:textbox.Text.Trim() button.Text 也即以上2个表达式的数值是不一样的,而造成原因,应该就是2个控件中的内容不一致.你仔细检查一下.

卓尼县19750234141: c#中string类型和char类型的区别 -
仁砖衡博: char类型只能容纳一个文字,在只想保存并处理一个文字的时候的选择.string是可以容纳多个文字,当然一个也可以.关联:对string进行处理的时候,有的时候,需要把string转化成char 可以用这样的方法:string str= "abcd"; char chr= str[2]; 反之,由char转化为string就简单多了.char chr = “a”; string str = chr.toString();

卓尼县19750234141: c#中结构体和char[]转换的问题 -
仁砖衡博: string str = ReadLogFile.ReadEndTokens("E:\\RobotErrorLog_0811.log", 2, Encoding.Default, "\r\n");//系统默认字符集 我用过这种!

卓尼县19750234141: c#的foreach输出char数组的问题 -
仁砖衡博: 你这样写当然一直输出ABC啊,你C在B数组里遍历,然后输出的又是B数组,那你B数组赋值的时候就是ABC,输出当然是ABC,你输出的其实是个数组.Console.WriteLine(b);这里改成Console.WriteLine(c);试试

卓尼县19750234141: C#中char是占两个字节的.那么: -
仁砖衡博: 1.char是字符类型,只能是'a'.至于'aa'那不是字符了. 2.char a='a'的话,在内存中'a'就是占2个字节,不会有空格填补什么的... 数据库的char类型才是用空格填补,别跟数据库的char类型混掉.

卓尼县19750234141: c# 关于char字符的处理 -
仁砖衡博: var s = "你好"; var cr = new char[500]; Array.Copy(s.ToCharArray(), cr, s.Length); var ss = new string(cr).Trim('\0'); //效率低,不用知道实际长度 或者 var ss = new string(cr, 0, s.Length); //效率高,要知道实际长度//如果要数组可以这样 var rs = new char[s.Length]; //没有空值的实际长度 Array.Copy(cr, rs, s.Length);

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网