Encoding 提供一个前导码(即一个字节数组),可以将它作为编码过程中所产生的字节序列的前缀。如果前导码中包含字节顺序标记(在 Unicode 中,码位为 U+FEFF),则它会帮助解码器确定字节顺序和转换格式或 UTF。Unicode 字节顺序标记的序列化结果(十六进制)如下所示:

  • UTF-8:EF BB BF

  • UTF-16 Big-Endian 字节顺序:FE FF

  • UTF-16 Little-Endian 字节顺序:FF FE

  • UTF-32 Big-Endian 字节顺序:00 00 FE FF

  • UTF-32 Little-Endian 字节顺序:FF FE 00 00

其中,UTF-8的字节顺序标记分别是EF  BB  BF转换成十进制以后是239  298  191 .

当我们通过自己编写的程序读取文件中的数据时候,如果编码不正确,就会导致读取错误。

例如:现在有一个文件,编码类型为UTF-8n(这种编码也属于UTF-8编码,但是文件中不包含字节顺序标记)。如果我们使用C#提供的StreamReader类进行读取,指定的编码为Encoding.Unicode的时候,会错误的读取该数据。但是如果该文件的编码类型为UTF-8则不会读取发生错误,因为我们指定的编码是可以识别UTF-8编码的。如果想正确的读取UTF-8n文件,我们只需要将StreamReader的编码指定为Encoding.UTF-8就可以了。

但是有时候我们需要制作一些数据来进行测试。需要将UTF-8数据转换成UTF-8n或者是将UTF-8n 转换成UTF-8类型。

下边的简单代码演示如何进行转换:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using IWshRuntimeLibrary;

namespace WindowsApplication7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string name;
        //UTF-8字符标记
        private const Byte b1 = 239;
        private const Byte b2 = 187;
        private const Byte b3 = 191;
        bool ishavebom = false;
        /**//// <summary>
        /// 清除字符标记
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                ishavebom = HasBom();

                using (BinaryReader br = new BinaryReader(System.IO.File.Open(this.textBox1.Text, FileMode.Open)))
                {
                    
                    FileInfo fi = new FileInfo(this.textBox1.Text);

                    using (BinaryWriter bw = new BinaryWriter(System.IO.File.Open(fi.DirectoryName + "\\ClearBom_" + fi.Name, FileMode.Create)))
                    {
                        try
                        {
                            if (ishavebom)
                            {
                                br.ReadByte();
                                br.ReadByte();
                                br.ReadByte();
                            }
                            do
                            {
                                bw.Write(br.ReadByte());
                            }
                            while (br != null);
                        }
                        catch (EndOfStreamException)
                        { }
                        bw.Close();
                    }
                    br.Close();
                }
                MessageBox.Show("Over");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


        }
        /**//// <summary>
        /// 添加上字符标记
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                ishavebom = HasBom();
                using (BinaryReader br = new BinaryReader(System.IO.File.Open(this.textBox1.Text, FileMode.Open)))
                {
                    FileInfo fi = new FileInfo(this.textBox1.Text);

                    using (BinaryWriter bw = new BinaryWriter(System.IO.File.Open(fi.DirectoryName + "\\AddBom_" + fi.Name, FileMode.Create)))
                    {
                        try
                        {
                            if (!ishavebom)
                            {
                                bw.Write(b1);
                                bw.Write(b2);
                                bw.Write(b3);
                            }
                            do
                            {
                                bw.Write(br.ReadByte());
                            }
                            while (br != null);
                        }
                        catch (EndOfStreamException)
                        { }
                        bw.Close();
                    }
                    br.Close();
                }
                MessageBox.Show("Over");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        /**//// <summary>
        /// 检查是否存在字符标记
        /// </summary>
        /// <returns></returns>
        private bool HasBom()
        {
            try
            {
                using (BinaryReader br = new BinaryReader(System.IO.File.Open(this.textBox1.Text, FileMode.Open)))
                {
                    FileInfo fi = new FileInfo(this.textBox1.Text);

                    if (br.ReadByte() == b1)
                    {
                        if (br.ReadByte() == b2)
                        {
                            if (br.ReadByte() == b3)
                            {
                                br.Close();
                                return true;
                            }
                        }
                    }
                  
                    br.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return false;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog fd = new OpenFileDialog();
            DialogResult dr = fd.ShowDialog(this);
            if (dr == DialogResult.OK)
            {
                this.textBox1.Text = fd.FileName;
            }
        }
    }
}

转载于:https://www.cnblogs.com/yangyang8848/archive/2007/08/01/839129.html

如何将UTF-8转换为UTF-8n相关推荐

  1. android ansi编码格式,如何将UTF字符串转换为ANSI并使用JAVA-ANDROID在SSD中创建ANSI文本文件...

    我在java中编写了一个Android应用程序以获取用户答案并将其保存在文件中. 问题是该文件保存在utf-8中. 最终用户将在IBM SPSS中打开这些文件,这是一个只能用ANSI(windows- ...

  2. UTF—8与UTF—8(无bom)格式

    BOM--Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在U ...

  3. Unicode、UTF-8 和 ISO8859-1到底有什么区别(转载)

    本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 c ...

  4. java 字符串 ansi转utf8_在Java中将ANSI字符转换为UTF-8

    有没有办法使用 Java将ANSI字符串转换为UTF. 我有一个使用readUTF& amp;的定制串行器. DataInputStream类的writeUTF方法用于反序列化和序列化字符串. ...

  5. UTF8转换为GB编码gb2312转换为utf-8

    这个方法是用windows的字符集转换的,跟sybase 的unicode码表可能在某些符号上有差别,对于大部分字符来说,尤其是 汉字,应该不会有问题的,如果要求比较高的话,可以买sybase的 un ...

  6. 错误: 编码 GBK 的不可映射字符 (0x80)

    在我想要在命令行使用println输出一些中文的时候,发现编码出现错误 原因: java程序在编译的时候,需要使用JDK开发工具包中的JAVAC.EXE命令,而JDK开发工具包是国际版的,默认格式为U ...

  7. Java发送邮件工具类(可发送匿名邮件)

    为什么80%的码农都做不了架构师?>>>    为了不想到处去下载jar包,我使用maven为我管理,在开始编码这些东西之前,我们先在pom.xml文件中<dependenci ...

  8. ISAPI_Rewrite3.1相关知识

    http://blog.csdn.net/keke0307/article/details/7023551 本文引用自-Club·King<isapi_rewrite3.1完整中文手册> ...

  9. java linux urlencode_java字符编码转换研究(转)

    1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是" ...

  10. 关于编码ansi、GB2312、unicode与utf-8的区别

     关于编码ansi.GB2312.unicode与utf-8的区别 2014-01-25 08:51 529人阅读 评论(0) 收藏 举报 本文章已收录于: 关于编码ansi.GB2312.uni ...

最新文章

  1. SpringBoot 操作 ElasticSearch 详解(万字长文)
  2. 服务器状态监控之一背景介绍及解决方案建议
  3. 每天一记 10.01.27
  4. mac bash file密码_Mac系统 | 菜鸟程序员项目模拟数据迁移,会安装Mysql服务端吗
  5. Win11怎么打开以前的word文档
  6. ajax 微信code获取_计算机毕业设计中微信小程序实现微信登录(Java后台)
  7. -moz、-ms、-webkit
  8. 典型的异步客户端套接字构建
  9. ARC项目中部分类不用ARC
  10. 阿里云云大使经验分享:老司机9招带你玩转云大使推广
  11. 更改MyEclipse匹配颜色
  12. 【MySQL】MySQL常用SQL关键字
  13. windows服务器直播推流
  14. 图卷积神经网络GCN---空间卷积层代表作
  15. 北京大学暑期学校总结
  16. lsdyna如何设置set中的node_list_技术成长日记-Vim-3.Vim中重要的概念
  17. CPU结构及工作原理
  18. HCIE必经之路(五)——OSPF综合实验(STUB及NSSA)
  19. Pr 入门教程:了解基本用户界面
  20. postek二次开发_各类标签一机打尽博思得C168条码打印机评测

热门文章

  1. python属性_Python属性()
  2. 深入了解C++的广泛应用
  3. 服务器指定网卡进行备份数据避免影响业务口
  4. http协议、cookie与session介绍
  5. 以太坊POA共识机制Clique源码分析
  6. Centos磁盘管理和文件系统管理
  7. puppet的相关介绍
  8. 大卫谈学习5:成长的烦恼
  9. Windows 8 VHD 概述与使用
  10. 用SYS本地登录或远程登录引起ORA-01031错误