UTF-8就是Unicode Transformation Format-8是Unicode的一种变换编码格式。
UTF-8有以下特性:
UCS字符U+0000到U+007F(ASCII)被编码为字节0x00到0x7F(ASCII兼容).这意味着只包含7位ASCII字符的文件在ASCII和UTF-8两种编码方式下是一样的.
所有>U+007F的UCS字符被编码为一个多个字节的串,每个字节都有标记位集.因此,ASCII字节(0x00-0x7F)不可能作为任何其他字符的一部分.
表示非ASCII字符的多字节串的第一个字节总是在0xC0到0xFD的范围里,并指出这个字符包含多少个字节.多字节串的其余字节都在0x80到0 xBF范围里.这使得重新同步非常容易,并使编码无国界,且很少受丢失字节的影响.
可以编入所有可能的231个UC S代码
UTF-8编码字符理论上可以最多到6个字节长,然而16位B MP字符最多只用到3字节长.
Bigendian UCS-4字节串的排列顺序是预定的.
字节0xFE和0xFF在UTF-8编码中从未用到.
下列字节串用来表示一个字符.用到哪个串取决于该字符在Unicode中的序号.
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx从上表还可以看出 UTF-8每个编码字符都不可能以“10”开头 “10”是以连接符的形式出现在后面的编码字节开头。因此UTF-8编码在存储和传输时是不容易出错的。
下面是UTF-8到Unicode的编码转换代码(J2 ME环境下的实现)UTFC2UniC方法包含了编码转换逻辑。/**
*将UTF-8字节数据转化为Unicode字符串
*@p aram ut f_data b yte[] -U TF-8编码字节数组
*@param len int -字节数组长度
*@return String-变换后的Unicode编码字符串
*/pub lic static String UTF2Uni(byte[]utf_data, int len){
StringBuffer unis=new StringBuffer();char unic=0;int ptr=0;int c ntB its=0;fo r(;p tr<len;)
{cntB its=getC ntB its(ut f_da ta[ptr]);if(c ntB its==-1)
{
++ptr;c o nt inue;
}elseif(c ntB its==0)
{unic=UTFC2UniC(utf_data,ptr,cntB its);
++ptr;
}else
{unic=UTFC2UniC(utf_data,ptr,cntB its);ptr+=cntBits;
}unis.appe nd(unic);
}return unis.to S tring();
}
/**
*将指定的UTF-8字节组合成一个Unicode编码字符
*@p aram ut f b yte[] -UTF-8字节数组
*@param sptr int -编码字节起始位置
*@param cntB its int -编码字节数
*@return char-变换后的Unicode字符
*/pub lic static char UTFC2UniC(byte[]utf, int sptr, int cntBits)
{
/*
Unicode<->UTF-8
U-00000000-U-0000007F: 0 xxxxxxx
U-00000080-U-000007FF: 110xxxxx 10 xxxxxx
U-00000800-U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000-U-001 FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000-U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000-U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
*/int uniC=0; // repre sent the unicode charbyte firstByte=utf[sptr];int ptr=0; // po inter 0~15
//resolve single byte UTF-8 encoding charif(c ntB its==0)return(c har)fir stByte;
//re so lve the first bytefirs tB yte&=(1<<(7-c nt B its)) - 1;
//resolve multiple bytes UTF-8 encoding char(except the first byte)fo r(int i=sptr+c ntB its - 1; i>sp tr; --i)
{byte utfb=utf[i];uniC|=(utfb&0x3 f)<<ptr;ptr+=6;
}uniC|=fir stB yte<<p tr;return(c har)uniC;
}
//根据给定字节计算UTF-8编码的一个字符所占字节数
//UTF-8规则定义字节标记只能为0或2~6
private static int getCntBits(byte b)
{int cnt=0;i f(b==0)re t ur n-1;for(int i=7; i>=0; --i)
{if(((b>>i)&0x1)==1)
++cnt;elseb re ak;
}return(cnt>6| |cnt==1)?-1 :cnt;
}
参考资料
《UTF-8 and Unicode FAQ》——http://www.linuxforum.net/books/UTF-8-Unicode.html
Hostodo商家算是一个比较小众且运营比较久的服务商,而且还是率先硬盘更换成NVMe阵列的,目前有提供拉斯维加斯和迈阿密两个机房。看到商家这两年的促销套餐方案变化还是比较大的,每个月一般有这么两次的促销方案推送,可见商家也在想着提高一些客户量。毕竟即便再老的服务商,你不走出来让大家知道,迟早会落寞。目前,Hostodo有提供两款大流量的VPS主机促销,机房可选拉斯维加斯和迈阿密两个数据中心,且都...
关于半月湾HMBCloud商家之前也有几篇那文章介绍过这个商家的产品,对于他们家的其他产品我都没有多加留意,而是对他们家的DC5机房很多人还是比较喜欢的,这个比我们有些比较熟悉的某商家DC6 DC9机房限时,而且半月湾HMBCloud商家是相对便宜的。关于半月湾DC5机房的方案选择和介绍:1、半月湾三网洛杉矶DC5 CN2 GIA同款DC6 DC9 1G内存 1TB流量 月$4.992、亲测选择半...
? ? ? ?创梦网络怎么样,创梦网络公司位于四川省达州市,属于四川本地企业,资质齐全,IDC/ISP均有,从创梦网络这边租的服务器均可以****,属于一手资源,高防机柜、大带宽、高防IP业务,另外创梦网络近期还会上线四川联通大带宽,四川联通高防IP,一手整CIP段,四川电信,联通高防机柜,CN2专线相关业务。成都优化线路,机柜租用、服务器云服务器租用,适合建站做游戏,不须要在套CDN,全国访问快...