[C#参考]字符编码

微软的那个臭屁的JOEL(就是写《JOEL说软件》的那个牛人)曾说:“每一位软件开发人员必须、绝对要至少具备UNICODE与字符集知识(没有任何例外)”,我也常常困扰于字符集的转换等很多问题,所以这次下决心要把他搞个清楚。

有关字符编码的学习,在这篇blog中,就从两个程序开始:

class TestDataGenerator
{
    public static void CreateNewTestDataFile(string FileName, int record_length)
    {
        using(FileStream fs = File.Create(FileName))
        {
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < record_length; i++ )
            {
                sb.Append(‘的‘);
            }//for
            byte[] content = Encoding.Unicode.GetBytes(sb.ToString());
            fs.Write(content, 0, content.Length);
        }//using
    }//CreateNewTestDataFile()
}

在上面的代码中:

Encoding.Unicode.GetBytes(sb.ToString());

  这句话的意思就是把string编码成UTF-16的字节流。

调用该函数生成包含100个字符的测试文件:

TestDataGenerator.CreateNewTestDataFile("test.txt", 100);

  可以看到文件大小为200字节。原因是UTF-16使用2个字节来存储包括汉字ASCII码在内的字符

读取Unicode字符串:

FileStream fs = new System.IO.FileStream("test.txt", FileMode.Open, FileAccess.Read);
byte[] blob = new byte[100];
fs.Read(blob, 0, 100);
fs.Flush();
string strUtf16 = Encoding.Unicode.GetString(blob);
string strUtf8 = Encoding.UTF8.GetString(blob);

从Watch窗口可见, 将字符串强转为UTF-8形式会出现乱码,这是因为UTF-8标准使用3个字节来存储汉字等字符,而不是UTF-16的2个字节。

下面使用UTF-8编码存储字符:

byte[] content = Encoding.UTF8.GetBytes(sb.ToString());
fs.Write(content, 0, content.Length);

然后就能看到文件的大小为300个字节:

同理用UTF-16的编码方式去读取UTF-8编码方式存储的文件也是不行的。

对上面的代码解释几个概念:

C#的类Encoding的Encoding.Unicode属性:获取使用Little-Endian字节顺序的UTF-16格式的编码。

C#的类Encoding的Encoding.ASCII属性:获取ASCII(7位)字符集的编码。

C#的类Encoding的Encoding.UTF8属性:获取UTF-8格式的编码。

时间: 2024-11-08 19:32:32

[C#参考]字符编码的相关文章

C#NET字符编码加解密的参考代码

//C#NET字符编码加解密的参考代码我是从老外程序里面拷贝出来的希望对大家有所用 1 public string Encrypt(string name) { 2 byte ivId = GetIVId(name); 3 cipher.IV = GetIV(ivId); 4 var buf = Encoding.UTF8.GetBytes(name); 5 6 using (var ms = new MemoryStream()) { 7 ms.WriteByte(ivId); 8 using

python字符编码

1. 字符编码简介 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符 ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符) 后来为了将拉丁文也编码进了ASCII表,将最高位也占用了 阶段二:为了满足中文,中国人定制了GBK GBK:2Bytes代表一个字符 为了满

【字符编码】彻底理解字符编码

一.前言 在解决昨天的问题时,又引出了很多新的问题,如为什么要进行编码,这些编码的关系如何,如ASCII,IOS-8859-1,GB2312,GBK,Unicode之间的关系,笔者想要彻底理解字符编码背后的故事,遂进行了探索,具体笔记如下.如园友能读完本篇文章,我相信会解开很多疑惑. 二.字符编码 2.1 为何需要编码? 我们知道,所有的信息最终都表示为一个二进制的字符串,每一个二进制位(bit)有0和1两种状态.当我们需要把字符'A'存入计算机时,应该对应哪种状态呢,存储时,我们可以将字符'A

字符编码、文件操作、函数定义

一.字符编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有127个字符被编

字符编码介绍

参考:http://www.cnblogs.com/lizhenghn/p/3690406.html GB 2312     1981年5月发布     1.GB:国标拼音首字母: 2.共收入汉字6763个和非汉字图形字符682个: GBK           1995年12月发布 1.    GBK:"国标"."扩展"拼音首字母: 2.    GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1 国际标准(ISO 10646.1等同于GB 1

C语言字符编码处理

一.简介 由于历史原因,国际化的文字常常由于语言或者国家的原因使用不同的编码.libiconv库为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换. 二.安装 http://www.gnu.org/software/libiconv/ 三.API iconv函数族有三个函数,原型如下: iconv_t iconv_open(const char *tocode, const char *fromcode); 此函数说明将要进行哪两种编码的转换,tocode

java字符编码详解

引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国政府制定的,简体汉字编码规范,大陆所有计算机中的简体中文,都使用此种编码格式.目前,我也不知道还有另外的简体汉字编码规范.与此对应的还有BIG5,是中华民国政府制定的,繁体汉字的编码规范,一般应用于海外计算机的繁体中文显示.所谓的繁体中文Windows,简体中文Windows,指的就是采用BIG5和

python 处理字符编码问题

今天好不容易重新开始写Python做实验,结果被字符编码虐的体无完肤.其实之前就已经比较清楚python处理字符编码的套路,但是今天白天反复的出现can't encode/decode ..., the original code not in 178之类的提示,甚是无力,后来偶尔使用了一下sys.setdefaultencoding('utf8')就解决了全部问题,真是不解. 下面还是总结一下Python几个编码设置的含义吧. 1. #coding=utf8 这种形式的注释告诉解释器,应该以c

【转】Python字符编码详解

1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制符号.不过ASCII只用到了其中的一半(\x80以下),这也是MBCS得以实现的基础. 1.2. MBCS 然而计算机世界里很快就有了其他语言,单字节的ASCII已无法满足需求.后来每个语言就制定了一套自己的编码,由于单字节