谁了解UCS-2 little endian x86这个编码

| 522: 链接超时
-- Event ID: 242e87b9d9d81671
如果您是网站管理员,点击查看。如需网站监控,可以使用。
您的浏览器
百度云加速怎么读一个UCS-2 Little Endian的文件_百度知道
怎么读一个UCS-2 Little Endian的文件
提问者采纳
  UCS-2每字符使用2byte存储  所楼主用UltraEdit类软件打文件查看文件16进制数据清楚看  比 0x604f  i 0x6900  n 0x6E00  (端存储高位数据放低位址,本用UTF-16-LE看)  看存储字母用<img class="word-replace" src="/api/getdecpic?picenc=0a006c655fbyte另byte0x00  所include连起
0x6C00  楼主用string能按照byte存储字符式读取  所间00认空格 0x69空格6E空格63空格6C空格75空格64空格65空格  至于第位乱码能文件编码文件  举例说UTF-16-LE文件位0xFFFE读进string肯定乱码  建议楼主使用wchar_t* 存储wchar_t宽字符用2byte存储字符用存储系统认0x69001字符2字符  或者用转化函数string转unicode编码
来自团队:
其他类似问题
为您推荐:
endian的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁在C#中,当使用带有BOM头的UTF-8编码的字符串时,一定要注意。
1)如果该字符串用作路径,用来寻址。一定会出错。2)转换格式时,也很容易出错。例如字符串转int就一定会出错。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
什么是BOM?
BOM: Byte Order Mark
UTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,是为了支持UTF-16,UTF-32才加上的
BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。
Byte Order Marks are special characters at the beginning of a Unicode file to indicate whether it is big or little endian, in other words does the high or low order byte come first. These codes also tell whether the encoding is 8, 16 or 32 bit. You can recognise Unicode files by their starting byte order marks, and by the way Unicode-16 files are half zeroes and Unicode-32 files are three-quarters zeros. Unicode Endian Markers
Byte-order mark Description
EF BB BF UTF-8
FF FE UTF-16 aka UCS-2, little endian
FE FF UTF-16 aka UCS-2, big endian
00 00 FF FE UTF-32 aka UCS-4, little endian.
00 00 FE FF UTF-32 aka UCS-4, big-endian.
UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个&奎&的Unicode编码是594E,&乙&的Unicode编码是4E59。如果我们收到UTF-16字节流&594E&,那么这是&奎&还是&乙&?
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是&Bill Of Material&的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:
在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。
原来BOM是在文件的开始加了几个字节作为标记。有了这个标记,一些协议和系统才能识别。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
由于UTF8中的BOM头是可有可无的,又由于其BOM头会对数据造成影响,所以去BOM头显得十分必要。 下面的方法可以直接对内存中的字节数组进行操作,忽略BOM头将其转string类型。
public static string GetUTF8String(byte[] buffer)
if (buffer == null)
return null;
if (buffer.Length &= 3)
return Encoding.UTF8.GetString(buffer);
byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf };
if (buffer[0] == bomBuffer[0]
&& buffer[1] == bomBuffer[1]
&& buffer[2] == bomBuffer[2])
return new UTF8Encoding(false).GetString(buffer, 3, buffer.Length - 3);
return Encoding.UTF8.GetString(buffer);
当然在读取文件时,利用 new UTF8Encoding(false) 忽略BOM头也是可以的。
阅读(...) 评论()说说Unicode,UTF8,UTF16,BOM,Big endian,Little endian
Unicode可以看做是一个映射,它定义了一个数字代码,这个代码关联到一个字符。早期的Unicode是16位的,1996年后,Unicode2.0的出现,使得Unicode的编码范围从0-1
Unicode可以看做是一个映射,它定义了一个数字代码,这个代码关联到一个字符。
早期的Unicode是16位的,1996年后,Unicode2.0的出现,使得Unicode的编码范围从0-10FFFF(16进制),16进制10FFFF=二进制,即目前编到21位。
UTF(Unicode transformation format)是一个映射算法,它将每一个Unicode代码映射到一个字节串。这种映射是可逆的。因此可以理解为UTF是Unicode的实现方式,UTF有多种版本,如下:
UTF8和UTF16都是变长的编码方式,,只有UTF32才是定长的编码方式。之所以要变长方式,是因为定长方式有时会太占。
UTF8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF8编码和ASCII码是相同的。
2)对于n字节的符号(n&1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
具体在换算的时候,可以根据下面的表格,对应着填写。下面会有例子。如果文档有很多字母,则UTF8比纯粹的用UTF16节省了很多。
windows系统中,notepad或者其他一些软件在保存对话框的编码方式列表中出现&Unicode&这一个名字,这种叫法非常误导人,使人以为unicode和UTF8是并列的关系,这其实是早期的一个称呼(来自windows NT的早期版本的习惯,一直沿用),事实上它指的是UTF16。
big-endian,little-endian大端序,小端序和BOM(byte-order mark)
UTF16采用UCS-2格式直接存储。需要用两个字节存储,哪一个字节是高位哪一个字节是低位并没有特别规定。因此,就产生了2种方式,比如一个unicode编码为4E25的,存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。UTF8由于特殊的算法,因此也不存在大端小端的说法。
这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。
计算机并不会知道这个文件是大端序还是小端序,因此要在文件头加入标记。UTF8中,用字符EFBBBF 表示字节序,UTF16中用字符FEFF用来标示其字节序,如果出现在字节流的开头,则用来标识该字节流的字节序,是高位在前还是低位在前。如果它出现在字节流的中间,则表达零宽度非换行空格的意义,用户看起来就是一个空格。从Unicode3.2开始,U+FEFF只能出现在字节流的开头,只能用于标识字节序,就如它的名称&&字节序标记&&所表示的一样;除此以外的用法已被舍弃。取而代之的是,使用U+2060来表达零宽度无断空白。
不同编码的字节顺序标记的表示:
举个例子,对于&中&这个字,对应的unicode码是4E2D=101
如果对其用UTF16编码,,则根据大小端的不同,有以下2种。
FE FF 4E 2D UTF16大端
FF FE 2D 4E UTF16小端
如果使用UTF8,则根据4E2D=101,有15位长,,则对应
将101按照低位到高位,填补那些x,如果有不足就用0。
1110xxxx 10xxxxxx 10xxxxxx
11100100 10111000 10101101=E4B8AD
红色的就是101填补上去的,绿色的是补足的0。
UTF8 没有BOM
UTF8如果带有BOM,则就是加入编码EF BB BF
例子可以看出,如果忽略BOM,大小端。UTF16不一定会比UTF8占空间。因为UTF16和UTF8都是变长编码UTF8是1-4个字节,UTF16是2-4个字节。
参考文档:
你最喜欢的

我要回帖

更多关于 little endian x86 的文章

 

随机推荐