从C# String类理解Unicode(UTF8/UTF16)

上一篇博客:从字节理解Unicode(UTF8/UTF16)。这次我将从C# code 中再一次阐述上篇博客的内容。

C# 代码看UTF8

代码如下:

string test = "UTF-8你";

//把字符转换为 byte[]

byte[] bytearray_UTF8 = Encoding.UTF8.GetBytes(test);

// byte[] to 16 进制的字符形式

String hexString = BitConverter.ToString(bytearray_UTF8);

运行后的结果"hexString "就是"55-54-46-2D-38-E4-BD-A0",字符"你"占3个字节,3个字节为"E4-BD-A0"。

完全符合上篇博客用txt分析的结果。(请参考上篇博客。从字节理解Unicode(UTF8/UTF16)

C# 代码看UTF16

代码如下:

string test = "UTF-8你";

//把字符转换为 UTF16 byte[]

byte[] bytearray_Unicode = Encoding.Unicode.GetBytes(test);

//byte[] to 16 进制的字符形式

String hexString_UTF16 = BitConverter.ToString(bytearray_UTF8);

运行后的结果"hexString_UTF16"就是"55-00-54-00-46-00-2D-00-38-00-60-4F",字符"你"占2个字节,3个字节为"60-4F"。(Widnwos(.net)默认Unicode是UTF16)

完全符合上篇博客用txt分析的结果。当年字节序也完全一样,因为我的CPU是intel的,注定式低字节序。(请参考,上篇博客从字节理解Unicode(UTF8/UTF16)

从C#代码String 类和从文本角度查看二进制角度得到的结果是完全一致的。当然这也不难理解,无论从String类角度,还是文本角度,他们使用的都是UTF8/UTF16。那么他们从字节角度都应该得到一致的结果。

从字节角度看图片和视频??

那么从一个文本文件的二进制,然后在知道这个文本用的是UTF8/UTF16,(其实很多情况我们可以判断出一个文本文件的编码是UTF8或者UTF16),就可以从二进制的角度去理解和修改文本文件。这样即使你把文本文件损坏,然后修复者按照这样的方式,可以把大部分的文本修复回来,只要损坏程度不高,理解起来完全没有问题。

那么或许你会问,那么图片和视频呢?他们不也是一个一个的字节吗?那么我可以从字节角度去理解或者修复一副图片和一个视频文件吗?

读到这里你是不是想到一个TED演讲,说的是一个摄影师,照相机被人偷走,最后找到相机,但是文件都没被删除了,于是他求助数据修复师,最后得到一些非常奇怪的图片,然后他就办了一个这样照片的展览。

那么当然是可以得。但是实际操作起来是很麻烦的。因为,图片和视频都有复杂的格式,格式决定他们是如何存储和读取信息的。类似于字符的UTF8/UTF16。图片有JPG等等格式,你必须理解这样格式是怎么编码的,你才能去正确的修改图片。

感兴趣的话,可以参考以下文章。

JPEG编解码过程详解

http://www.zhihu.com/question/22293783

时间: 2024-08-23 11:30:06

从C# String类理解Unicode(UTF8/UTF16)的相关文章

C++ Builder 的 JSON 解析和生成,包括自带的 JSON 和第三方的 jsoncpp,支持 UNICODE (UTF-8 / UTF-16)

C++ Builder 自带的 JSON 处理,支持 UNICODE (UTF-8 / UTF-16): http://www.cppfans.com/cbknowledge/skills/files/json.asp JSON 解析和生成 - 文件处理 ? JSON 解析方法和规则,读取 JSON 里面特定的值,JSON 类的继承关系 ? JSON 类 TJSONValue|TJSONObject|TJSONPair|TJSONArray|TJSONString|TJSONNumber|TJS

一句话理解字符编码(Unicode ,UTF8,UTF16)

Unicode和ASCII码属于同一级别的,都是字符集,字符集规定从1到这个字符集的最大范围每个序号都各表示什么意思.比如ASCII字符集中序号65表示"A". 那接下来的UTF8和UTF16就相当于我们在计算机中怎么表示这个序号了.这就好比,通常情况下我们用十进制表示数字(1表示一个,2表示两个).但是有时候我们也会根据情况用二进制,八进制,十六进制表示. UTF8编码规则表示一个序号可能用一个字节/两个字节/三个字节来表示.UTF16编码规则表示一个序号只会用两个字节表示.其他的编

Unicode(UTF-8, UTF-16)令人混淆的概念

为啥需要Unicode 我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了描述简单都用十进制,十六进制,八进制表示.实际上都是等价的,没啥太多不一样.其他啥文字图片之类的其他东东计算机不认识.那为了在计算机上表示这些信息就必须转换成一些数字.你肯定不能想怎么转换就怎么转,必须得有定些规则.于是刚开始的时候就有ASCII字符集(American Standard Code for Information Interchange, "

细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

1. Unicode与ISO 10646 全世界很多个国家都在为自己的文字编码,并且互不想通,不同的语言字符编码值相同却代表不同的符号(例如:韩文编码EUC-KR中“???”的编码值正好是汉字编码GBK中的“茄惫绢”).因此,同一份文档,拷贝至不同语言的机器,就可能成了乱码,于是人们就想:我们能不能定义一个超大的字符集,它可以容纳全世界所有的文字字符,再对它们统一进行编码,让每一个字符都对应一个不同的编码值,从而就不会再有乱码了. 如果说“各个国家都在为自己文字独立编码”是百家争鸣,那么“建立世

【转】Unicode(UTF-8, UTF-16)令人混淆的概念

参考地址:http://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html Java中,char类型用UTF-16编码描述一个代码单元 为啥需要Unicode 我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了描述简单都用十进制,十六进制,八进制表示.实际上都是等价的,没啥太多不一样.其他啥文字图片之类的其他东东计算机不认识.那为了在计算机上表示这些信息就必须转换成一些数

(转) Unicode(UTF-8, UTF-16)令人混淆的概念

原文地址:http://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html 为啥需要Unicode 我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了描述简单都用十进制,十六进制,八进制表示.实际上都是等价的,没啥太多不一样.其他啥文字图片之类的其他东东计算机不认识.那为了在计算机上表示这些信息就必须转换成一些数字.你肯定不能想怎么转换就怎么转,必须得有定些规则.于是刚开

萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的ASCII码是否处于0~127之间,如果是就提取一个字符,否则提取两个.在测试分字效果的时候,这种方法出了问题.比如我传一个"abcde一二三四五"进去,abcde可以正常分解成 a b c d e,而后面的"一二三四五"则成了乱码. 于是我开启了谷歌之旅,搜索"

转:Unicode,UTF-8,UTF-16,UTF-32,gb2312,gbk区别

1.ascII码 0x0****  共127个,英文字母和符号. 但英文够用,中文,韩文其他字符不够用,于是产生了unicode编码 2.GB2312/GBK 中国人发明,扩展字节,用两个字节(16位)能表示所有中文字符.诞生了GB2312编码. 后为包含更多的字符,如希腊字母等,诞生了GBK 3.Unicode 外国人发明的GBK,但格局更大,收录了全世界所有的文字和符号.但与gbk和gb23 12不兼容.世界所有字符都能用两个字节表示. 4.Utf-8 英国人基于unicode发明.因为对他

String类理解

1.首先应该知道的是:String是一个类,不属于基本类型,而是引用类型. 2.创建String对象的三种方式的比较: 第一种是先去String pool检查是否存在"abc"常量,具体比较使用equals()方法,如果没有,则在String pool 中添加"abc",然后返回一个引用(地址)赋给 i:如果有,则直接返回一个引用给i,无须在String pool 中添加对象. 第二种也是先去String pool 中查看是否存在该String对象,如果没有,也在p