对字符串操作的一些研究

博客介绍了CLR中字符串由16位Unicode码值组成,虽方便字符转换,但呈现时可能浪费空间。阐述了UTF - 16、UTF - 8、ASCII等编码方式特点,指出应用中应尽量用UTF - 8或UTF - 16,还提及.NET可编码到指定代码页,最后说明不同编码各有优劣,需依应用场合选择。

        首先,在CLR中所有的字符都被表示为16位的Unicode码值,所有的字符串都是由16位的Unicode码值组成。

        16位的Unicode编码可以表示当今世界上的所有字符,所以,不必为字符的不同而担心保存的方式,这给字符的转换会很方便。

        但是字符串保存在CLR中,如果我们需要呈现出来,比如写入文本文件,写入网络流,如果按照这样的方式,可能会很浪费空间,比如是英文字符就不需要这么宽的长度来保存,并且对于特定的字符集,比如中文字符集,这些是需要特定的代码页来编码的,如GB2312等等。

编码方式主要有:

             UTF-16:一个16为字符编码为两个字节,性能最好,但是占用空间较大。

             UTF-8:按需分配字节数。

            ASCII:单字节编码,只适用于英文字符。

        UTF-8:当今世上最流行的编码方式,它可以按照码值灵活安排字节数,也就是存储空间。所以我们在应用的时候应该尽量使用UTF-8UTF-16这样的编码方法来进行字符串的编码。因为这样很安全,不会出现不认识的字符。 UTF1616位字符编码为2个字节,而UTF8则有四种可能,比如英文字符他会编码为一个字节,一些欧洲和中东语言,它会编码为两个字节,一些东亚地区的语言它会编码成三个字节,代理字符会被转换为4个字节。

        当然.NET还允许把字符编码到指定的代码页中,比如GB2312。但是一旦出现指定代码页中没有的字符,将不能正确呈现。

见下面代码:

ContractedBlock.gifExpandedBlockStart.gifEncoding#region Encoding
InBlock.gif
InBlock.gif
using System;
InBlock.gif
using System.Collections;
InBlock.gif
using System.Text;
InBlock.gif
InBlock.gif
public class MyClass
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        RL();
InBlock.gif
InBlock.gif        
string s = "大XXYYZZ";
InBlock.gif        
InBlock.gif        Encoding gbk 
= Encoding.GetEncoding("GB2312");
InBlock.gif        
InBlock.gif        
byte[] u8Bytes = Encoding.UTF8.GetBytes(s);
InBlock.gif        
byte[] u16Bytes = Encoding.Unicode.GetBytes(s);
InBlock.gif        
byte[] gbkBytes = gbk.GetBytes(s);
InBlock.gif
InBlock.gif        
//此处打印转换过来的字节码
InBlock.gif
        Console.WriteLine("UTF8Bytes:   " + BitConverter.ToString(u8Bytes));
InBlock.gif        Console.WriteLine(
"UTF16Bytes:  " + BitConverter.ToString(u16Bytes));
InBlock.gif        Console.WriteLine(
"GBKBytes:    " + BitConverter.ToString(gbkBytes));
InBlock.gif
InBlock.gif        RL();
InBlock.gif
InBlock.gif        
//用Utf8进行解码
InBlock.gif
        Console.WriteLine("UTF8Bytes:   " + Encoding.UTF8.GetString(u8Bytes));
InBlock.gif        Console.WriteLine(
"UTF16Bytes:  " + Encoding.UTF8.GetString(u16Bytes));
InBlock.gif        Console.WriteLine(
"GBKBytes:    " + Encoding.UTF8.ToString(gbkBytes));
InBlock.gif
InBlock.gif        RL();
InBlock.gif
InBlock.gif        
//用Unicode进行解码
InBlock.gif
        Console.WriteLine("UTF8Bytes:   " + Encoding.Unicode.GetString(u8Bytes));
InBlock.gif        Console.WriteLine(
"UTF16Bytes:  " + Encoding.Unicode.GetString(u16Bytes));
InBlock.gif        Console.WriteLine(
"GBKBytes:    " + Encoding.Unicode.GetString(gbkBytes));
InBlock.gif
InBlock.gif        RL();
InBlock.gif
InBlock.gif        
//用GB2312进行解码
InBlock.gif
        Console.WriteLine("UTF8Bytes:   " + gbk.GetString(u8Bytes));
InBlock.gif        Console.WriteLine(
"UTF16Bytes:  " + gbk.GetString(u16Bytes));
InBlock.gif        Console.WriteLine(
"GBKBytes:    " + gbk.GetString(gbkBytes));
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif       
InBlock.gif
InBlock.gif        RL();
InBlock.gif
InBlock.gif        
InBlock.gif        
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ContractedSubBlock.gifExpandedSubBlockStart.gif    
Helper methods#region Helper methods
InBlock.gif
InBlock.gif    
private static void WL(object text, params object[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Console.WriteLine(text.ToString(), args);    
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
private static void RL()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Console.ReadLine();    
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
private static void Break() 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        System.Diagnostics.Debugger.Break();
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockEnd.gif    
#endregion

ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif
#endregion


 


测试的结果为:

Encoding_00.gif



        可以看出,对应的字节一定要对应的解码才能正确体现出来,用GB2312对中英文混和的字符串最节省空间,UTF8也是比较节约的,只是一个汉字占用了三个字节,UTF16可能对中英文混和的字符编码效率最好,但是占用空间也最多,这样看来各有千秋,要根据我们的应用场合来决定编码了。

转载于:https://www.cnblogs.com/Dragonpro/archive/2005/09/30/247252.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值