凯之风 / cawler / 谨慎使用Encoding.Default

分享

   

谨慎使用Encoding.Default

2011-03-16  凯之风

谨慎使用Encoding.Default

    
在处理文本时,经常需要处理Encoding的概念。存在这个问题的原因在于,在.NET程序内文本只是string和char对象,而保存到硬盘时,或者准备用socket把它发送出去时,都得先转换成byte[]或者字节流。而转换的算法,就是Encoding。Encoding不同文本文件的行数也不同。

老外的程序里面,都喜欢用Encoding.ASCII,这是因为他们主要只使用western字符;于是我们经常要在他们的代码把Encoding.ASCII替换成Encoding.Default才能使用。

所谓Encoding.Default,是指当前系统设置的“默认字符集编码方式”。你可以通过控制面板里面的区域选项设置它(这是在我的机器上的设定):



 

 

注意红色方框内的部分,“为你的非Unicode程序选择一个语言来匹配其本地语言版本”。这里选择了Chinese (PRC),则Encoding.Default等效于Encoding.GetEncoding("gb2312")。gb2312在代码页936,所以所有以双字节编码(ANSI编码)字符的程序在这个系统上会使用936代码页,使用Unicode的不受影响。

你可以看到 Encoding.Default的值是和系统设定相关的。这样,有些时候会出问题:一台机器用socket发送一段文本到另一台机器,两边都设定编码方式为Encoding.Default,但两台机器的区域选项的这个设置是不一样的,却没有被注意;如果发送的是非western字符,则接受方必然会得到乱码。这种问题往往会令人很困惑。

所以在面对中文且为ANSI编码的情况下,最好不要用Encoding.Default,而用 Encoding.GetEncoding("gb2312"),或者更直接的Encoding.GetEncoding(936);而如果有可能的话,最好全部使用unicode,比如utf-8,也就是Encoding.UTF8。有了unicode之后,其实我们不需要代码页的概念。
 
另外:1.通过 Thread.CurrentThread.CurrentCulture=   new   CultureInfo( "en "); 来设置改变
            2.自定义一个全局的App.Encoding静态属性来作为默认编码类型,它可以默认为Encoding.Default,但想改的话还有后悔药可用
            3.使用 Encoding.Convert()方法转换
               例如:
                Encoding   shiftJIS=Encoding.GetEncoding( "Shift-JIS "); 
               //取默认编码转换后String的Byte数组 
               byte[]   defEncByte=Encoding.Default.GetBytes(rs[ "myText "].ToString()); 
               //Convert方法转换此默认编码Byte数组到目标编码数组 
                byte[]   shiftEncByte=Encoding.Convert(Encoding.Default,shiftJIS,defEncByte); 
               还原转换后的Byte数组到String 
               string   QText=shiftJIS.GetString(shiftEncByte);

数据库和数据库引擎应用程序的国际化注意事项:http://msdn.microsoft.com/zh-cn/library/ms190245(SQL.90).aspx


 
 
 
 
 
 
 
 
 
 
 
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>