【技巧】.NET中28591代码页的妙用
acmilan2016/05/07软件综合 IP:四川
认真学过C#或.NET的同学应该知道,在.NET中,string是以char组成的,而char则表示16位Unicode的字符,字节流则以byte[]表示。字节流要想变为字符串,就要进行解码(XXXXXXXXXXXtString),而有时候我们并不想解码,而是按照C语言中习惯的方法使用这些字符串,这时候就需要使用28591代码页了。

28591代码页介绍:
在Windows和.NET中,28591代码页指ISO-8859-1编码,是一种曾经广泛用于UNIX操作系统的单字节编码标准。它针对ASCII进行了扩展,其中80-9F为扩展控制字符,A0-FF加入了西欧语言常用的扩展字符。它的特殊之处在于,Unicode制定时考虑与它兼容,因此Unicode前256个字符与它是完全一一对应的。也就是说,28591代码页将8位字符直接扩展为16位字符。这个性质让它在编程中非常有用。另外,28591是.NET框架原生支持的代码页,在Windows和Linux/UNIX中都能使用,不必担心不可用的问题。

28591应用场合:需要按字节操作,但需要string类提供的便利的时候。
<code class="lang-c">/*
 * Created by SharpDevelop.
 * User: surface
 * Date: 04/11/2016
 * Time: 21:43
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
using System.Text;
    
namespace mywinforms1234
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
                
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
        void Button1Click(object sender, EventArgs e)
        {
            var arr_a = new byte[] { 0x80, 0x81, 0x82, 0x83 };
            var arr_b = new byte[] { 0x81, 0x82 };
            string a = Encoding.GetEncoding(28591).GetString(arr_a);
            string b = Encoding.GetEncoding(28591).GetString(arr_b);
            MessageBox.Show(a.Contains(b).ToString()); // 测试a是否包含b
        }
    }
}</code>

<code class="lang-c">/*
 * Created by SharpDevelop.
 * User: surface
 * Date: 2016/5/6
 * Time: 15:26
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Text;
using System.IO;
     
namespace encodingtest1
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
                 
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
        void Button1Click(object sender, EventArgs e)
        {
            // 示例文本
            string sampletxt = "sssaaa\r\n我是中文测试一二三四五\r\n";
                 
            // 写入示例文本,注意.NET默认写入的文本有BOM
            File.WriteAllText("abc.txt", sampletxt, Encoding.UTF8);
                 
            // 注意一定要将detectEncodingFromByteOrderMarks关掉,否则会受BOM影响而失效
            string content = "";
            using (StreamReader sr =
                   new StreamReader("abc.txt", Encoding.GetEncoding(28591), false))
            {
                content = sr.ReadToEnd();
                MessageBox.Show(content);
                //content = content.Replace("\u00ef\u00bb\u00bf", "");
                if (content.StartsWith("\u00ef\u00bb\u00bf")) // 如果有BOM的话
                    content = content.Substring(3); // 去掉bom
                MessageBox.Show(content);
            }
                 
            // 重新写入修改过的内容
            using (StreamWriter sw =
                   new StreamWriter("abc.txt", false, Encoding.GetEncoding(28591)))
            {
                sw.Write(content);
            }
                 
            // 再次测试有无BOM
            using (StreamReader sr =
                   new StreamReader("abc.txt", Encoding.GetEncoding(28591), false))
            {
                content = sr.ReadToEnd();
                MessageBox.Show(content);
            }
                 
            // 如果单纯是为了写入无BOM的UTF-8文件,不用这么麻烦,这样就可以了
            File.WriteAllBytes("abc.txt", Encoding.UTF8.GetBytes(sampletxt));
                 
            // 再次测试有无BOM
            using (StreamReader sr =
                   new StreamReader("abc.txt", Encoding.GetEncoding(28591), false))
            {
                content = sr.ReadToEnd();
                MessageBox.Show(content);
            }
        }
    }
}</code>

[修改于 8年8个月前 - 2016/05/07 23:59:11]

来自:计算机科学 / 软件综合
0
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年10个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}