| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5579 人关注过本帖
标题:字母转换为ASCII码程序的菜鸟问题
只看楼主 加入收藏
yyqzou
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2013-3-6
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:8 
字母转换为ASCII码程序的菜鸟问题
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 开发入门及项目实践第4章1_ASCII
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text!=string.Empty)
            {
                if (Encoding.GetEncoding("unicode").GetBytes(new char[] { textBox1.Text[0] })[1] == 0)//为什么这里要等于0?[1]是什么意思?是指textBox1.Text[0]的第二个数组名?,如果删去==0它就说无法将类型byte隐式转换为bool?//书上说此代码为判断输入是否为字母?为什么我将[1]改为[0]系统就说"请重新输入字母!"?
                {
                    textBox2.Text = Encoding.GetEncoding("unicode").GetBytes(textBox1.Text)[0].ToString();//此代码就是将(textBox1.Text)[0]的值以字符串的形式转换于unicode,unicode为ASCII的意思吗???为什么[0]要放在括号外面啊????
                }
                else
                {
                    textBox2.Text = string.Empty;
                    MessageBox.Show("请重新输入字母!");
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox3.Text!=string.Empty)
            {
                int i;
                if (int.TryParse(textBox3.Text,out i))
                {
                    textBox4.Text = ((char)i).ToString();//将ASCII码转换为字符??? string j="a" ;
                    // 下面这个代码  string k = Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[0].ToString();不是将ASCII码转换为字符???
                }
                else
                {
                    MessageBox.Show("请正确输入ASCII码值");
                }
            }
            string j="a" ;
            string k = Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[1].ToString();//为什么这里要等于0?[0]是什么意思?是指textBox1.Text[0]的第一个数组名?
            //string k 与上面的if语句又有什么关系呢???为什么将后一个[0]改成[1]就还能运行呢???new char[] { k[0] }究竟是什么意思啊??
搜索更多相关主题的帖子: namespace private public 开发 
2013-03-18 15:29
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:10 
真是爱学习的孩子.
if (Encoding.GetEncoding("unicode").GetBytes(new char[] { textBox1.Text[0] })[1] == 0)//为什么这里要等于0?[1]是什么意思?是指textBox1.Text[0]的第二个数组名?,如果删去==0它就说无法将类型byte隐式转换为bool?//书上说此代码为判断输入是否为字母?为什么我将[1]改为[0]系统就说"请重新输入字母!"?
textBox1.Text表示取textBox文本框中的文本,但是有可能会在textBox框中输入很多个字,那么textBox1.Text会把你输入的所有字符都取出来,textBox1.Text[0]则表示只取第一个字符,因为程序只转一个字符,所以这里只取了一个.
一句代码中,为了方便,常常会写数个表达式,太长的语句对新手来说确实有点困难,但只要知道先后顺序,也是很容易理解的.
我们先看==号左边的表达式,Encoding.GetEncoding("unicode").GetBytes(new char[] { textBox1.Text[0] })[1]
()号表示方法或优先执行的语句,这里我们先把方法清理出来
先不看()号里面的内容,那么就变成了这样Encoding.GetEncoding().GetBytes()[1]
再按.号来看,我们知道.是代表调用方法或是属性,这里.后面的内容都带有(),那么是调用的方法
Encoding.GetEncoding().GetBytes()[1]这句拆开来看如下
Encoding en = Encoding.GetEncoding("unicode");
byte[] by = en.GetBytes();
byte b = by[1];
因为编写代码的人认为,这些方法的返回值除了在这里使用以外,其它地方不会使用,所以并没有将方法的返回值赋给某个相应类型的变量,而是直接 方法.方法 ,这相当于用第一个方法的返回值,继续调用第二个方法,而没有将第一个方法的返回值先用变量保存起来.
那么Encoding.GetEncoding("unicode").GetBytes(new char[] { textBox1.Text[0] })[1]这句的意思就是,使用unicode编码,将GetBytes()括号中的东西转换成byte数组,也就是Encoding.GetEncoding("unicode").GetBytes(new char[] { textBox1.Text[0] })这句返回的是一个byte数组,而[1]则表示这个byte数组的下标,也就是取这个byte数组的第二个字符(因为数组下标是从0开始计算的).
现在我们在回过来看==号
因为这是一个if语句,那么if肯定是要得到一个bool型的值,也就是不为真就为假,要么进if,要么进else
所以简化以后就成了 if(byte数组的第二个字符 == 0),就是判断这个byte数组的第二个字符,是不是0,是0就进if,不是0就进else,如果删掉==0,就成了if(byte数组的第二个字符),这样无法满足if语句判断的要求,byte数组中的每个字符,就是byte型,也就成了if(byte型的数据),所以提示无法将类型byte隐式转换为bool
现在的问题就是为什么要判断byte数组的第二个字符是不是为0,根据unicode编码规则,只要是字母数字的,只占用unicode编码的第一位,第二位是0,也就是只有一个字节,而汉字则两个字节都有值,是双字节,所以只要byte数组的第二位有值,那么就不是字母,需要进入else提示重新输入字母.

ps:天啊,才解释一个if语句就码了这么多字了

[ 本帖最后由 yhlvht 于 2013-3-18 16:24 编辑 ]
2013-03-18 16:23
yyqzou
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2013-3-6
收藏
得分:0 
int P_scalar = 0;//定义值类型变量并赋值为0
            Regex P_regex = new Regex("^[\u4E00-\u9FA5]{0,}$"); //创建正则表达式对象,用于判断字符是否为汉字//\u不是指Unicode对字符串变量进行赋值吗?难道9FA5与4E00就是值,但这个值又表示什么意义呢?如果不是那么E,F,A有各自表示什么意思呢?为什么9FA5与4E00不可以更改,各自表示什么意思???{0,}又是什么意思啊?
当中的-号又是什么意思啊???
               
            for (int i = 0; i < txt_str.Text.Length; i++)//遍历字符串中每一个字符
            {
                P_scalar =P_regex.IsMatch(txt_str.Text[i].ToString()) ? ++P_scalar : P_scalar;
                    
         //"如果检查的字符是汉字则计数器加1"这句话是什么意思???
             }
            txt_count.Text = P_scalar.ToString();//显示汉字数量
2013-03-18 16:31
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:0 
textBox2.Text = Encoding.GetEncoding("unicode").GetBytes(textBox1.Text)[0].ToString();//此代码就是将(textBox1.Text)[0]的值以字符串的形式转换于unicode,unicode为ASCII的意思吗???为什么[0]要放在括号外面啊????
这句我们同样拆开来看吧
Encoding en = Encoding.GetEncoding("unicode");
byte[] by = en.GetBytes(textBox1.Text);
byte b = by[0];
textBox2.Text = b.ToString();
那么意思我们就懂了,把textBox1里面的内容,都转换成了byte数组,但是只取了数组的第0位,转换成字符串,显示在textBox2中.
即使textBox1里面输入了很多字符也不要仅,虽然是全部都转换了,但只显示了第一个字符的编码.
而上面if语句中,只取了第一个字符进行转换,再判断.
那么按这句的意思,其实上面也可以不用只取第一个字符来判断,全部转换了,取数组下标1来判断,也是一样的.
然后我发现,其实这两句内容几乎一样,那么可以把byte数组的值取出来赋给变量,那么判断如果是字母,则从变量直接输出就可以了,而不用再让电脑多执行一次计算,虽然这一句表达式的计算时间对于现在的电脑来说几乎可以忽略掉.
unicode并不是ASCII的意思,这是两种不同的编码格式,但对于字母来说,这两种编码的值都是一样的
这句的[0],并不是if里面的那个textBox1.Text[0],这里的[0]跟if里面的[1]含义相同,判断使用下标[1]来判断,输出用的下标[0],因为下标[1]的值是0嘛,所以只输出下标[0]
2013-03-18 16:41
yyqzou
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2013-3-6
收藏
得分:0 
回复 2楼 yhlvht
不愧是顶级大神!!!我彻底搞懂啦!
2013-03-18 17:07
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:0 
Regex P_regex = new Regex("^[\u4E00-\u9FA5]{0,}$"); //创建正则表达式对象,用于判断字符是否为汉字//\u不是指Unicode对字符串变量进行赋值吗?难道9FA5与4E00就是值,但这个值又表示什么意义呢?如果不是那么E,F,A有各自表示什么意思呢?为什么9FA5与4E00不可以更改,各自表示什么意思???{0,}又是什么意思啊?
\u4E00-\u9FA5中 \u表示unicode编码,而后面的4E00则表示这是一个unicode的编码,他对应的是一个汉字,\u9FA5同样是用unicode编码表示的一个汉字
比如0-9,表示包含从0至9的每一个数字,那么只要是数字,就包括在0-9之间了,这个理解了就能理解\u4E00-\u9FA5了,前面的表示第一个汉字的编码,后面的表示最后一个汉字的编码,加上-号合起来表示所有汉字
{}表示匹配个数或次数,{0,}表示只要是汉字,不管几个都匹配,当然后面每次只取1个去匹配,但也符合这个正则表达式的要求.比如{1}就只匹配1个,你给他两个汉字,就不能匹配了,{2}就只匹配两个汉字,你传1个汉字进去,就匹配不了,如{2,5}表示2至5个匹配,你传1个汉字,或是6个及6个以上的汉字拿去匹配,就不行,2至5个汉字就可以.
这个用数字来解释更容易理解,比如要匹配5至8位的QQ号,那么就是{5,8},如果QQ号是5至8位的,就匹配,如果你给一个10位的QQ号,就不匹配,而{0,}表示只要你拿进去匹配的东西里面存在数字,就匹配上

 P_scalar =P_regex.IsMatch(txt_str.Text[i].ToString()) ? ++P_scalar : P_scalar; //"如果检查的字符是汉字则计数器加1"这句话是什么意思???
就是用了一个变量来保存匹配上了多少个汉字
P_scalar = P_regex.IsMatch(txt_str.Text[i].ToString()) ? ++P_scalar : P_scalar;
首先=号为赋值符号,最后执行,我们可以先看=号右边的,=号右边的是一个三元运算符(也叫三目运算符)的表达式
三元表达式为A ? B : C ,意思是 先判断A是否成立,如果成立,就执行B,不成立执行C,这其实是if else的简写
那P_scalar = P_regex.IsMatch(txt_str.Text[i].ToString()) ? ++P_scalar : P_scalar;这句我们可以写成如下语句
if(P_regex.IsMatch(txt_str.Text[i].ToString()))
{
  P_scalar = ++P_scalar;
}
else
{
   P_scalar = P_scalar;
}
所以呢,这句意思就是,判断如果是个汉字,那么计数器+1,如果不是汉字,计数器不变,还是原本的值
最后把计数器的值显示在txt_count文本框中

[ 本帖最后由 yhlvht 于 2013-3-18 17:31 编辑 ]
2013-03-18 17:26
yyqzou
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2013-3-6
收藏
得分:0 
回复 2楼 yhlvht
private void button2_Click(object sender, EventArgs e)
        {
            if (textBox3.Text != string.Empty)
            {
                int i;
                if (int.TryParse(textBox3.Text, out i))
                {
                    textBox4.Text = ((char)i).ToString(); ;//就靠 textBox4.Text = ((char)i).ToString();就将ASCII码转换为字符???为什么我注销掉  //string j = "a"; //string k = Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[1].ToString();还是能将ASCII码转换成字母啊!为什么呢???既然如此的话 //string j = "a"; //string k=Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[1].ToString();还有写的必要吗???

                  
                }
                else
                {
                    MessageBox.Show("请正确输入ASCII码值");//整个if语句貌似和下面 string j = "a";// string k = Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[1].ToString();没有联系啊!
                }
            }
            string j = "a";
            string k = Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[1].ToString();//如果输入14927就输出“㩏“这个字,这个字不是英文字母啊!这个k和上面怎么看也没有联系啊!有没有什么方法能使程序输入只能显示ASII所能转化的字母(就是只有标点符号与因为字母和数字)
        }

    }
2013-03-18 18:15
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:0 
//就靠 textBox4.Text = ((char)i).ToString();就将ASCII码转换为字符???
是的,将数字转为字符型,就是按照asicc码进行转换的

为什么我注销掉  //string j = "a"; //string k = Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[1].ToString();还是能将ASCII码转换成字母啊!为什么呢???既然如此的话 //string j = "a"; //string k=Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[1].ToString();还有写的必要吗???
如果你能看懂代码写的是什么,就会知道这句是将字符转换成asicc吗而已,只不过下标取错了,这句跟上面if语句里面判断输入的是不是字母是一样的,下标[1]里面的值是0而已啊

 MessageBox.Show("请正确输入ASCII码值");//整个if语句貌似和下面 string j = "a";// string k = Encoding.GetEncoding("unicode").GetBytes(new char[] { j[0] })[1].ToString();没有联系啊!
是的,if语句跟下面的代码没有关系

//如果输入14927就输出“㩏“这个字,这个字不是英文字母啊!这个k和上面怎么看也没有联系啊!
每个asicc数字对应的字符,你到网上查一下asicc码表,就知道你输入一个数字会出现什么字符了.k的这两句不用管了

有没有什么方法能使程序输入只能显示ASII所能转化的字母(就是只有标点符号与因为字母和数字
简单的方法,就是你对照着asicc表,然后在程序里面判断不是你想要的数字就提示重新输入呗.
2013-03-18 18:49
陌莫5
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2021-1-7
收藏
得分:0 
回复 4楼 yhlvht
厉害  
清晰明了  
2021-01-07 16:23
快速回复:字母转换为ASCII码程序的菜鸟问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017972 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved