肄若芸(yiruoyun)的专栏

--------行成于思,毁于随!我们不缺乏智慧,只是少了创新!

肄若芸ID:yiruoyun
95220次访问,排名940好友5人,关注者18
在意网,中国学生网,德风园网,校计算机教学网络,个人工作室(益韵网),毕业了,XXX研究所(信息后处理研究方向)
yiruoyun的文章
原创 152 篇
翻译 0 篇
转载 4 篇
评论 24 篇
肄若芸的公告
〖 留 言 〗 〖 查 看 〗


Google

肄若芸专栏

最近评论
QQ:367013000:老大,我怎么下不了呀,
lover_p:太好了!这些问题困扰我很久了!谢谢你!
xMars:这属于数字水印范畴
ag:是不是应该说明是什么地方引用这个文章的吧??
肄若芸:公司的组织结构经常发生变化,而我们的域帐户信息(AD)是和真实的组织机构相对应的。组织机构变化了,我们自然要改动相应的域帐户信息啦。这是一件很痛苦的事情,原因是什么,大家都明白。那么能不能用程序来解决这个问题呢?(windows2003的管理工具好像已经支持批量修改域帐户信息了)。
我创建了一个windows应用程序来解决:

在Form上放置了六个comboBox……
文章分类
收藏
    相册
    我和老婆
    资源文件
    UI类
    B.G.M
    goldenwebawards
    一号工作室
    一点设计
    三槐堂UI
    中国UI设计
    中国网页设计年鉴
    冰冰
    安徽网页联盟
    建站资源
    极品桌面
    视点设计
    视觉传达
    页元素
    技术类
    15秒站-安装部署
    ActiveX 控件容器
    ASP.NET Cassini Sample Web Server
    ASP.NET专刊
    aspcool
    C#开源项目
    c-sharpcorner
    csharphelp.com
    dotnet tools
    DOTNET俱乐部
    GotDotNet
    icsharpcode(zip rule)
    IDE Codeing
    it on line
    JAVA
    MSDN WEB开发
    MSDN 用户控件
    MSDN开发精选文章荟萃
    MSDN网络讲座
    pc性能测试
    VB月光
    vc代码
    Web Form 狀態管理
    xfocus
    动网新闻
    天天安全
    开源
    看雪学院
    网络中国
    网络协议
    软件屋
    朋友
    shanhe的专栏
    thornet的blog也不错
    付阳同学
    孟子的站不错
    辣鸡块
    其它类
    anyp
    asp300
    ccopus(DISK)
    free textbox
    k666
    web应用网
    商务中国(代理)
    塞酷下载
    天新下载
    小凤居安全下载
    控件
    浙飞工作室
    黑白网络
    学习类
    6to23-ASP
    apple VB
    ASP-CHINA(2yup)
    WEB技术网
    全文翻译
    双语字典
    统一教学
    娱乐类
    模拟器
    游戏秘籍
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 ASP.NET编码 收藏

    新一篇: 我的儿子吃螃蟹 | 旧一篇: ORA-03114之原因分析,含CDC引发问题处理参考

    乱码-我们心中的痛!

    “字符与编码”是一个被经常讨论的话题。即使这样,时常出现的乱码仍然困扰着大家。虽然我们有很多的办法可以用来消除乱码,但我们并不一定理解这些办法的内在原理。而有的乱码产生的原因,实际上由于底层代码本身有问题所导致的。

    因此,不仅是初学者会对字符编码感到模糊,有的底层开发人员同样对字符编码缺乏准确的理解。

    字符与编码的发展

    字符串在内存中的存放方法

    ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS)。比如,“Bob123 在内存中为:

    426F 62 31 32 33 00

    B o b 1 2 3 \0

    在使用ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示,比如,“中文123 在中文Windows95 内存中为7个字节:

    D6D0CEC4 31 32 33 00

    中文1 2 3 \0

    UNICODE中,计算机存放字符串时,改为存放每个字符在UNICODE 字符集中的序号。目前计算机一般使用2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串“中文123 Windows 2000 下,内存中实际存放的是5 个序号,共10个字节:

    2D4E8765 3100 3200 3300 0000

         中文1 2 3 \0

    【示例代码】

    string str = "中文123";//UNICODE编码

    Console.WriteLine(str.Length);//长度为5

    //字符串与字节串之间相互转换

    Encoding gb = Encoding.GetEncoding("gb2312");

    byte[] bytes = gb.GetBytes(str);//从字节按照GB2312得到字符数量

    char[] chars = gb.GetChars(bytes);//从字节按照GB2312得到UNICODE字符串

    str = gb.GetString(bytes);

    //要将string按照某种编码写入文本文件,有两种方法

    //第一种:用Stream类写入已经按照指定编码转化好的字节串

    StreamWriter sw = new StreamWriter("1.txt");//9字节:

    sw.Write(chars);

    sw.Close();

    //第二种方法:构造指定编码的Writer来写入字符串

    StreamWriter sw2 = new StreamWriter("2.txt", false, gb); //7字节

    sw2.Write(str);

    sw2.Close();

    Unicode字符集

    名称的由来

    Unicode字符集编码是Universal Multiple-Octet Coded CharacterSet 通用多八位编码字符集的简称,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

    UTF-8 编码

    UTF-8Unicode的其中一个使用方式。UTFUnicodeTranslation Format,即把Unicode转做某种格式的意思。UTF-8使用可变长度字节来储存Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

    UTF-32UTF-16 UTF-8

         Unicode 标准的编码字符集的字符编码方案,UTF-16 使用一个或两个未分配的16 位代码单元的序列对Unicode 代码点进行编码;UTF-32 即将每一个Unicode 代码点表示为相同值的32 位整数

    易产生乱码的情况

         UNICODE 程序在不同语言环境间移植时的乱码

    UNICODE 程序中的字符串,都是以某种ANSI 编码形式存在的。如果程序运行时的语言环境与开发时的语言环境不同,将会导致ANSI 字符串的显示失败。

    由于客观原因,有时候我们必须在中文操作系统下运行非UNICODE 的日文软件,这时我们可以采用一些工具,比如,南极星,AppLocale 等,暂时的模拟不同的语言环境。

         网页提交字符串

    当页面中的表单提交字符串时,首先把字符串按照当前页面的编码,转化成字节串。然后再将每个字节转化成"%XX" 的格式提交到Web 服务器。比如,一个编码为GB2312 的页面,提交"" 这个字符串时,提交给服务器的内容为"%D6%D0"

    在服务器端,Web 服务器把收到的“%D6%D0转化成[0xD6, 0xD0] 两个字节,然后再根据GB2312 编码规则得到“中” 字。

    默认情况下,当提交“%D6%D0 给服务器时,将返回[0x00D6, 0x00D0] 两个UNICODE 字符,而不是返回一个“中” 字符。所以出现乱码

         从数据库读取字符串

    通过数据库客户端(比如ODBC JDBC)从数据库服务器中读取字符串时,客户端需要从服务器获知所使用的ANSI 编码。当数据库服务器发送字节流给客户端时,客户端负责将字节流按照正确的编码转化成UNICODE 字符串。

         电子邮件中的字符串

    当一段Text 或者HTML 通过电子邮件传送时,发送的内容首先通过一种指定的字符编码转化成“字节串”,然后再把“字节串”通过一种指定的传输编码(Content-Transfer-Encoding)进行转化得到另一串“字节串”。

    最常用的Content-Transfer-Encoding Base64 Quoted-Printable 两种。

    邮件标题编码

    邮件的标题,用了一种更简短的格式来标注“字符编码”和“传输编码”。比如,标题内容为“中”,则在邮件源代码中表示为:

    // 正确的标题格式

    Subject: =?GB2312?B?1tA=?=

    第一个“=?”与“?”中间的部分指定了字符编码,在这个例子中指定的是GB2312

    ?”与“?”中间的“B”代表Base64。如果是“Q”则代表Quoted-Printable

    最后“?”与“?=”之间的部分,就是经过GB2312 转化成字节串,再经过Base64 转化后的标题内容。

    如果“传输编码”改为Quoted-Printable,同样,如果标题内容为“中”:

         Subject: =?GB2312?Q?=D6=D0?=

     

    【示例代码】

    //乱码的产生

    Encoding client = Encoding.GetEncoding("gb2312");

    byte[] bytes = client.GetBytes(str);//根据GB2312得到字节

    //服务器端按照gb2312正确解码

    Encoding serverOK = Encoding.GetEncoding("GB2312");

    string server = serverOK.GetString(bytes);

    Console.WriteLine("正确转换:" + server);

    //服务器按照Unicode错误解码

    server = Encoding.Unicode.GetString(bytes);

    Console.WriteLine("错误转换:" + server); //乱码

     

     

    .NET下的编码类

    System.Text

    System.Text 命名空间包含表示ASCIIUnicodeUTF-7UTF-8 字符编码的类;用于将字符块转换为字节块和将字节块转换为字符块的抽象基类。

     

    【示例代码】

    //编码之间的转换

    string unicodeStr = "this is a room";

    //创建不同编码

    Encoding ascii = Encoding.ASCII;

    Encoding unicode = Encoding.Unicode;

    //从一种编码转换成另外一种编码

    byte[] unicodeBytes = unicode.GetBytes(unicodeStr);

    byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeStr);

    //转换成字符串

    char[] asciiChars=new char[ascii.GetCharCount(asciiBytes,0,asciiBytes.Length)];

    ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);

    string asciiStr = new string(asciiChars);

     

    Console.WriteLine("Original:{0}", unicodeStr);

    Console.WriteLine("ASCII Coverted string:{0}", asciiStr);

    ASP.NET下的编码

    web.config文件全球化:

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />

         requestEncodingapp请求时的编码,responseEncodingIIS响应编码

    下面的两种只改变当前页面,而上面改变整个应用程序

    Response.ContentEncoding:获取或设置输出流的HTTP 字符集。

    HttpRequest.ContentEncoding:表示客户端的字符集的Encoding 对象。

    比如:我们在不同页面之间的传输过程设置不同的编码集,就容易产生乱码

    汉字编码

    1980年,为了使每一个汉字有一个全国统一的代码,我国颁布了第一个汉字编码的国家标准:GB2312-80《信息交换用汉字编码字符集》基本集,简称GB2312.这个字符集是国内所有汉字系统的统一标准。到了后来又公布了国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,简称GB18030

    目前在中文WINDOWS操作系统中,.NET编程中默认的的代码页就是GB18030简体中文

    中文汉字字符可以使用区位码来表示:

         例如“好”字的十六进制区位码是ba c3,前两位是区域,后两位代表位置,ba处在第26区,“好”处在此区汉字的第35位也就是c3位置,所以数字代码就是2635。这就是GB2312汉字区位原理。

     

    【示例代码:随即生成中文验证码

    //获取GB2312编码表

    Encoding gb = Encoding.GetEncoding("gb2312");

    //调用函数随即生成4个随机中文汉字编码

    object[] bytes = createRegion(4);

    //根据汉字编码的字节数组解码出汉字

    string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));

    string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));

    string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));

    string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));

     

    string strKey = str1 + str2 + str3 + str4;

    Session["regcode"] = strKey;

    byte[] data = gb.GetBytes(strKey);

    Response.ContentEncoding = gb;

    Response.OutputStream.Writer(data,0,data.Length);

     

     

    public static object[] createRegionCode(int length)

    {

        //定义一个字符串苏组储存汉字编码的组成元素

    string[] rBase = new String[16] {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};

     

        Random rnd = new Random();

     

        object[] bytes = new object[length];

        //每循环一次产生一个含两个元素的十六进制字节数组,并将其放入object数组中

        //汉字由四个区位码组成

        //区位码第一和第二位作为字节数组第一个元素

        //区位码第三和第四位作为字节数组第二个元素

        for (int i = 0; i < length; i++)

        {

            //区位码第一位

            int r1 = rnd.Next(11, 14);

            string str_r1 = rBase[r1].Trim();

            //区位码第二位

    //更换随机数发生器的种子避免产生重复值

            rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);

            int r2;

     

            if (r1 == 13)

            {

                r2 = rnd.Next(0, 7);

            }

            else

            {

                r2 = rnd.Next(0, 16);

            }

     

            string str_r2 = rBase[r2].Trim();

     

            //区位码第三位

            rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);

            int r3 = rnd.Next(10, 16);

            string str_r3 = rBase[r3].Trim();

     

            //区位码第四位

            rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);

            int r4;

            if (r3 == 10)

            {

                r4 = rnd.Next(1,16);

            }

            else if (r3 == 15)

            {

                r4 = rnd.Next(0, 15);

            }

            else

            {

                r4 = rnd.Next(0, 16);

            }

     

            string str_r4 = rBase[r4].Trim();

     

            //定义两个字节变量存储产生的随机汉字区位码

            byte byte1 = Convert.ToByte(str_r1 + str_r2,16);

            byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);

            //将两个字节变量存储在字节数组中

            byte[] str_r = new byte[] { byte1,byte2};

            //将随即生成的汉字的字节数组放入object数组中

            bytes.SetValue(str_r, i);

        }

     

        return bytes;

    }

    Base64编码规则

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充120字节。并在最后编码完成后在结尾添加12个“=”。

     

    例:将对ABC进行BASE64编码

    首先取ABC对应的ASCII码值。A65B66C67)。

    再取二进制值A01000001B01000010C01000011),然后把这三个字节的二进制码接起来(010000010100001001000011),再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值(00010000)(00010100)(00001001)(00000011)。再把这四个字节数据转化成10进制数得(16)(20)(19)(3)。最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D)。这里的值实际就是数据在字符表中的索引。

    BASE64字符表:

    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

     

    【示例代码利用Base64编码把图片存储在XML

    //把图片转换成字符串

    //图象文件临时存储在Byte数组中

    Byte[] FileByteArray=new Byte[FileLength];

    Stream so=loFile.PostFile.InputStream;

    so.Read(FileByteArray,0,FileLength);

     

    string img=Convert.ToBase64String(FileByteArray);

     

     

    //把字符串转换成图片

    Response.ContentType = "img";//设定输出文件类型

    Response.OutputStream.Write(Convert.FromBase64String(strData), 0, nSize);

    Response.End();

    //也可以保存为图象

    FileStream fs = new FileStream(@"C:\1.bmp", FileMode.OpenOrCreate, FileAccess.Write);

    fs.Write((Convert.FromBase64String(strData),0,nSize);

    fs.Close();

    发表于 @ 2008年07月03日 12:16:33|评论(loading...)|收藏

    新一篇: 我的儿子吃螃蟹 | 旧一篇: ORA-03114之原因分析,含CDC引发问题处理参考

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 肄若芸