C#的二进制文件操作及汉字编码转换

 

C# 的二进制文件操作及汉字编码转换
 
1 .数值应保存在二进制文件
首先列举文本、二进制文件的操作(读写)方法:
方式 1
// 文本文件操作:创建 / 读取 / 拷贝 / 删除
using System;
using System.IO;
class Test
{
   string path = @"f:/t.txt";
   public static void Main()
   {       
      //
创建并写入 ( 将覆盖已有文件 )
      if (!File.Exists(path))
      {
//StreamWriter m=new           
//StreamWriter(path,true,Encoding.Default,1);//ASCII,1   Encoding.Default :即//UTF-8编码 这样就可以指定编码方式
    using (StreamWriter sw = File.CreateText(path))
         {
            sw.WriteLine("Hello");
         }
      }
      //
读取文件
      using (StreamReader sr = File.OpenText(path))
      {
        string s = "";
        while ((s = sr.ReadLine()) != null)
        {
           Console.WriteLine(s);
        }
     }
     //
删除 / 拷贝
     try
     {
        File.Delete(path);
        File.Copy(path, @"f:/tt.txt");
     }
     catch (Exception e)
     {
        Console.WriteLine("The process failed: {0}", e.ToString());
     }
   }
}

方式 2
// 流文件(二进制)操作
private const string name = "Test.data";
public static void Main(String[] args)
{
    //
打开文件 ()  , 或通过 File 创建立如: fs = File.Create(path, 1024)
    FileStream fs = new FileStream(name, FileMode.CreateNew);
    //
转换为字节 写入数据 ( 可写入中文 )
    Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file.");
    //
字节数组 , 字节偏移量 , 最多写入的字节数
BinaryWriter   w   =   new   BinaryWriter(fs);
// 设置要写入的偏移量  
fs.Position=fs.Length;
  //  fs.Write(info, 0, info.Length);   这个也可以
    w.Close();
    fs.Close();
    //
打开文件
    fs = new FileStream(name, FileMode.Open, FileAccess.Read);
    //
读取
    BinaryReader r = new BinaryReader(fs);
    for (int i = 0; i < 11; i++)
    {
        Console.WriteLine(r.ReadInt32());
    }
    w.Close();
    fs.Close();
在将一系列二进制数如方式 1 写入到 file.txt( 二进制 ) 文件后,打开 file.txt 后显示的数据二进制数有些错误,有些正确。(与存入的不一样) 向文件中写入的 默认(也可以设置) 都是使用 UTF-8 编码 。打开 file.txt 是也是默认 UTF-8 编码。
 
若将其如方式 2 存入 二进制文件,则显示的数据一致。若将二进制数(整数)保存为文本文件出错。二进制文件是直接写入文件的(磁盘)没有经过编码和读取时的解码
 
2 .汉字编码转换
相关:
UNICODE 是为了处理包括中文,日文等字符而提出的一种通用的字符集。最初的UNICODE为双字节字符集,即16位编码,能够包括65,536个字符。但这样的容量并不能满足所有需要,因此,现在的UNICODE已经扩展到4个字节,能够容纳1,112,064 个字符,而这些在16位之后的扩展背称为增补字符。
 
UTF-32 UTF-16 UTF-8 Unicode 标准的编码字符集的字符编码方案。
UTF-8 使用一至四个字节的序列对编码 Unicode 代码点进行编码
UTF-8 使用一至四个字节的序列对编码 Unicode 代码点进行编码。U+0000 至 U+007F 使用一个字节编码,U+0080 至 U+07FF 使用两个字节,U+0800 至 U+FFFF 使用三个字节,而 U+10000 至 U+10FFFF 使用四个字节。UTF-8 设计原理为:字节值 0x00 至 0x7F 始终表示代码点 U+0000 至 U+007F(Basic Latin 字符子集,它对应 ASCII 字符集)。这些字节值永远不会表示其他代码点,这一特性使 UTF-8 可以很方便地在软件中将特殊的含义赋予某些 ASCII 字符。
 
  GB2312(1980 ) 一共收录了 7445 个字符,包括 6763 个汉字和 682 个其它符号。汉字区的内码范围高字节从 B0-F7 ,低字节从 A1-FE ,占用的码位是 72*94=6768 。其中有 5 个空位是 D7FA-D7FE 。当然也可以表示数字和字符(一个字节,与 ASCII 表示相同)。
 
 
要读取一个以 GB2312 编码的包含汉字、数字、字母的二进制文件。
String strName =Encoding.GetEncoding("gb2312").GetString(name,0,i) ;
// name 是读取的二进制数组。
这样就能将二进制数组转换为 汉字、数字或字母
 
同样:也可以将包含汉字、数字、字母的字符串转换为 二进制数组保存到 二进制文件。
String unicodeString =   " 备用43E";
Byte[] encodedBytes = Encoding.GetEncoding("gb2312").GetBytes(unicodeString);
 
当然也可以进行二进制数组与UNICODE,UTF-8等编码方式的转换
Byte[] encodedBytes = utf8.GetBytes(unicodeString);
String decodedString = utf8.GetString(encodedBytes);
 
UnicodeEncoding unicode = new UnicodeEncoding();
Byte[] encodedBytes = unicode.GetBytes(unicodeString);
String decodedString = unicode.GetString(encodedBytes);
 
 

你可能感兴趣的:(C#)