.NET与外界交互字符串的处理

.NET与外界交互字符串的处理

.NET的应用程序中,字符串的表示都是由Unicode UTF-16字符数组表示。然而,你可能经常需要使用诸如UTF-8之类的其他格式的编码来与外部世界进行通信,这时需要一些转化工作。

现在假想一下有如下的应用场景:

场景一:你的.NET应用程序需要从一个指定的文件夹中读取一些其他系统生成的数据文件,然后对读取的数据进行字符串操作。

场景二:你的.NET应用是一个对外暴露的WebService,该WebService需要接收调用方传递过来的字节数组,然后对该字节数组进行处理。

场景三:你的.NET应用需要把GB2312的编码的字节数组,转换为Utf8的编码的字节数组。

 

场景一的解决办法是:清楚的了解或者指定文件的编码格式,然后把文件读取到一个字节数组中,然后使用该编码格式把字节数组转换为Unicode字符串。

示例代码如下:

        private void ReadFile(string fileName)
        {
            FileStream stream = new FileStream(fileName, FileMode.Open);
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, buffer.Length); //把文件的内容读取到字节数组中
            string str = Encoding.UTF8.GetString(buffer); //假定现在文件保存的编码是Utf8

            stream.Close();
        }


 

场景一的另一种解决办法是:使用StreamReader指定编码格式直接从文件流中读取字符串。

示例代码如下:

        private void ReadFile2(string fileName)
        {
            FileStream stream = new FileStream(fileName, FileMode.Open);
            StreamReader reader = new StreamReader(stream, Encoding.Default); //StreamReader的默认编码格式是Utf8,如果是其他需要在此指定
            string str = reader.ReadToEnd(); //直接从流中读取Unicode字符串

            reader.Close();
            stream.Close();
        }


 

场景二的解决办法:对字节数组进行Base64的编码处理,使其转换为ASCII码字符串。

Base64编码处理用到两个函数,分别是:Convert.ToBase64StringConvert.FromBase64String

 

场景三的解决办法:字节数组的编码转换需要用到Encoding.Convert函数把字节数组从一种编码转换为另一种编码。

示例代码如下:

        private void button3_Click(object sender, EventArgs e)
        {
            string s = "china中华人民共和国と中国語"; //多语言的Unicode字符串
            Console.WriteLine("多语言的Unicode字符串:" + s);
            Console.WriteLine();

            Encoding enUtf8 = Encoding.UTF8;
            Encoding enUnicode = Encoding.Unicode;
            Encoding enDefault = Encoding.Default; //在简体中文环境下是:简体中文(GB2312)

            byte[] bsUtf8 = enUtf8.GetBytes(s);
            byte[] bsUnicode = enUnicode.GetBytes(s);
            byte[] bsDefault = enDefault.GetBytes(s);
            Console.WriteLine("Utf8编码的输出");
            PrintByte(bsUtf8);
            Console.WriteLine(enUtf8.GetString(bsUtf8));
            Console.WriteLine();

            Console.WriteLine("Unicode编码的输出");
            PrintByte(bsUnicode);
            Console.WriteLine(enUnicode.GetString(bsUnicode));
            Console.WriteLine();

            Console.WriteLine("Default(GB2312)编码的输出");
            PrintByte(bsDefault);
            Console.WriteLine(enDefault.GetString(bsDefault));
            Console.WriteLine();
            
            //把Utf8编码的字节数组转换为Unicode编码的字节数组
            byte[] bsUnicode2 = Encoding.Convert(enUtf8, enUnicode, bsUtf8);
            Console.WriteLine("把Utf8编码的字节数组转换为Unicode编码的字节数组的输出");
            PrintByte(bsUnicode2);
            Console.WriteLine(enUnicode.GetString(bsUnicode2));
            Console.WriteLine();

            //错误的转换
            Console.WriteLine("*************************************");
            Console.WriteLine("把Utf8编码的字节数组转换为GB2312编码的字符串,得到的是字符串乱码");
            string s2 = enDefault.GetString(bsUtf8);
            Console.WriteLine(s2);
            Console.WriteLine();

            Console.WriteLine("把该字符串乱码再次转换到Utf8字节数组,得到新的字节数组和原来的已经不同(错误的转换不可逆)");
            byte[] bsUtf82 = enUtf8.GetBytes(s2);
            Console.Write("新得到的Utf8字节数组:");
            PrintByte(bsUtf82);
            Console.Write("原来的Utf8字节数组:");
            PrintByte(bsUtf8);
            Console.WriteLine();
            

            Console.WriteLine("使用错误的编码格式,进行字节数组转化的后果(把GB2312编码的字节数组当作Utf8转化为Unicode)");
            byte[] bsUnicode3 = Encoding.Convert(enUtf8, enUnicode, bsDefault);
            Console.Write("错误转换后Unicode字节数组:");
            PrintByte(bsUnicode3);

            byte[] bsUnicode4 = Encoding.Convert(enUtf8, enUnicode, bsUtf8);
            Console.Write("正确转换后Unicode字节数组:");
            PrintByte(bsUnicode4);
            Console.WriteLine();

        }


执行后的结果:

多语言的Unicode字符串:china中华人民共和国と中国語

Utf8编码的输出
38=6368696E61E4B8ADE58D8EE4BABAE6B091E585B1E5928CE59BBDE381A8E4B8ADE59BBDE8AA9E
china中华人民共和国と中国語

Unicode编码的输出
32=6306806906E06102D4E4E53BA4E116C71518C54FD5668302D4EFD569E8A
china中华人民共和国と中国語

Default(GB2312)编码的输出
27=6368696E61D6D0BBAAC8CBC3F1B9B2BACDB9FAA4C8D6D0B9FAD55A
china中华人民共和国と中国語

把Utf8编码的字节数组转换为Unicode编码的字节数组的输出
32=6306806906E06102D4E4E53BA4E116C71518C54FD5668302D4EFD569E8A
china中华人民共和国と中国語

*************************************
把Utf8编码的字节数组转换为GB2312编码的字符串,得到的是字符串乱码
china涓崕浜烘皯鍏卞拰鍥姐仺涓浗瑾?

把该字符串乱码再次转换到Utf8字节数组,得到新的字节数组和原来的已经不同(错误的转换不可逆)
新得到的Utf8字节数组:54=6368696E61E6B693EE859EE5B495E6B59CE78398E79AAFE98D8FE58D9EE68BB0E98DA5E5A790E4BBBAE6B693EE859EE6B597E791BE3F
原来的Utf8字节数组:38=6368696E61E4B8ADE58D8EE4BABAE6B091E585B1E5928CE59BBDE381A8E4B8ADE59BBDE8AA9E

使用错误的编码格式,进行字节数组转化的后果(把GB2312编码的字节数组当作Utf8转化为Unicode)
错误转换后Unicode字节数组:44=6306806906E0610FDFF3B4FDFFFDFFFDFFFDFFA7D9BADC793FDFFFDFFFDFFFDFF394FDFFFDFF5A0
正确转换后Unicode字节数组:32=6306806906E06102D4E4E53BA4E116C71518C54FD5668302D4EFD569E8A


 

从以上转换我们可以总结:一定要使用字节数组的正确的编码格式来进行转换,否则,得到乱码的字符串后,是不能可逆转换的。(这种转换包括从“字节数组转换为字符串”和“从一种字节编码转换为另一种字节编码”)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值