zoukankan      html  css  js  c++  java
  • 编码和解码(字符串与byte[]之间的转换)

    资源来自互联网http://www.cnblogs.com/dabaopku/archive/2012/02/27/2370446.html

     非常蛋疼的事情, google 和 baidu 在编码是分别采用了 UTF-8 和 GB2312

    基础知识

    UTF-8中,一个汉字对应三个字节,GB2312中一个汉字占用两个字节。 
    不论何种编码,字母数字都不编码,特殊符号编码后占用一个字节。 

    public static string MyUrlDeCode(string str, Encoding encoding)
    {
        if(encoding == null)
        {
            Encoding utf8 = Encoding.UTF8;
            //首先用utf-8进行解码                    
            string code = HttpUtility.UrlDecode(str.ToUpper(), utf8);
            //将已经解码的字符再次进行编码.
            string encode = HttpUtility.UrlEncode(code, utf8).ToUpper();
            if(str == encode) encoding = Encoding.UTF8;
            else encoding = Encoding.GetEncoding("gb2312");
        }
        return HttpUtility.UrlDecode(str, encoding);
    }

    编码、解码技术是我们在程序中开发中经常使用到的,对一些敏感信息的存储,比如密码之类的,我们一般是不会直接以明文直接存储到数据库的,而是会通过各种算法,可以是现成的MD5(一种散列算法)、或者是Hash算法+Salt(混淆因子),甚至是自己定义的一套算法进行加解密。这里不想阐述加解密技术,在之前的一篇博客当中,简单列举了两种基本方法,见.NET加解密技术。这里重点讲解一下编码、解码以及乱码的相关问题。

    我们先看一个简单的例子

    string str = "abcd"; //测试字符串
    byte[] bytes = Encoding.GetEncoding("ascii").GetBytes(str); //将字符串转成ascii编码的字节数组,这里的bytes数组,长度为4,分别对应于abcd的ascii码97、98、99、100
    string result = Encoding.GetEncoding("ascii").GetString(bytes); //将字节数组转回为字符串
    Console.WriteLine(result); //输出abcd

    ascii码是国际标准编码,全称为:美国信息交换标准编码,只能表示127个字符,不能代表汉字,

    我们对汉字进行ascii编码之后,是不能进行还原的。汉字不能转变为ascii码,因此会变成乱码,对乱码进行还原也就还原不了了。

    项目开发中经常会有出现乱码的情况

           这就是由于两端(服务端、请求端)编解码的方式不一致造成的。

          比如服务端是utf-8编码,而在客户端以gbk接收,那么就会出现乱码。

    所以解决乱码这个问题,思路就是从对方的编码方式入手,弄清楚对方的编码是什么编码,我这边就以什么编码来解码

    同一个字符在不同的编码下会被编成不同长度的编码,

    比如:ACSII,每个字符对应一个字节,实际上只使用了7位,从00h-7Fh。只能表达128个字符。

    GB2312, 中文的一种编码, 每个字符使用两个字节表示。

    UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。
    UTF - 8, 可以表达所有unicode字符, 每个字符可以用1 - 3 个字节表示。
    UTF - 16, 可以表达所有unicode字符, 每个字符可以用1 - 2 个16位整数表示。
    UTF - 32, 可以表达所有unicode字符, 每个字符可以用1个32位整数表示。

    using System.Text;
    byte[] b = Encoding.ASCII.GetBytes("yourstring");
    //  得到:121,111,117,114,115,116,114,105,110,103    
    /反向为:     
    byte[] b = new byte[]
    {
        121, 111, 117, 114, 115, 116, 114, 105, 110, 103
    };
    string str = Encoding.ASCII.GetString(b);
    //得到:str="yourstring"
  • 相关阅读:
    svn diff color
    svn 教程
    第40章 CAN—通讯实验—零死角玩转STM32-F429系列
    第39章 ETH—Lwip以太网通信—零死角玩转STM32-F429系列
    第38章 I2S—音频播放与录音输入—零死角玩转STM32-F429系列
    第37章 基于SD卡的FatFs文件系统—零死角玩转STM32-F429系列
    第36章 SDIO—SD卡读写测试—零死角玩转STM32-F429系列
    第35章 WWDG—窗口看门狗—零死角玩转STM32-F429系列
    第33章 TIM—电容按键检测—零死角玩转STM32-F429系列
    第34章 IWDG—独立看门狗—零死角玩转STM32-F429系列
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/7768873.html
Copyright © 2011-2022 走看看