导读就爱阅读网友为您分享以下“UTF-8到Unicode的编码转换”资讯希望对您有所帮助感谢您对92to.com的支持!
UTF-8就是Unicode Transfo rmation Format-8是Unicode的一种变换编码格式。
U TF-8有以下特性:
UCS字符U+0000到U+007F (ASCII)被编码为字节0x00到0x7F(ASCII兼容).这意味着只包含7位ASCII字符的文件在ASCII和UTF-8两种编码方式下是一样的.
所有>U+007F的UCS字符被编码为一个多个字节
1
的串,每个字节都有标记位集. 因此, ASCII字节(0x00-0x7F)不可能作为任何其他字符的一部分.
表示非ASCII字符的多字节串的第一个字节总是在0xC0到0 xF D的范围里,并指出这个字符包含多少个字节.多字节串的其余字节都在0 x80到0 xB F范围里.这使得重新同步非常容易,并使编码无国界,且很少受丢失字节的影响.
可以编入所有可能的231个UCS代码
U TF-8编码字符理论上可以最多到6个字节长,然而16位B MP字符最多只用到3字节长.
Bigendian UCS-4字节串的排列顺序是预定的.
字节0 xF E和0 xF F在U TF-8编码中从未用到.
下列字节串用来表示一个字符.用到哪个串取决于该字符在Unicode中的序号.
U-00000000-U-0000007F:
2
0 x xx x xx x
U-00000080-U-000007FF:
U-00000800-U-0000FFFF:
U-00010000-U-001FFFFF:
U-00200000-U-03FFFFFF:
U-04000000-U-7FFFFFFF:
110xxxxx 10xxxxxx 1110xxxx 10xxxxxx 10xxxxxx11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 111110xx10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 1111110x10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx
从上表还可以看出 U TF-8每个编码字符都不可能以“10”开头 “10”是以连接符的形式出现在后面的编码字节开头。因此U TF-8编码在存储和传输时是不容易出错的。
下面是UTF-8到Unic o de的编码转换代码(J2 ME环境下的实现) UTFC2UniC方法包含了编码转换逻辑。
/**
3
*将U TF-8字节数据转化为Unic o de字符串
*@pa ra m utf_data byte[] -UTF-8编码字节数组
*@pa ra m le n int-字节数组长度
*@return String-变换后的Unicode编码字符串
*/public static String UTF2Uni(byte[] utf_data, int len){
StringBuffer unis=new StringBuffer();char unic=0;int ptr=0;int cntBits=0;fo r(;pt r< le n;)
{cntBits=getC ntBits(utf_data[ptr]);if(c ntB it s==-1)
{
4
++ptr;continue;
}e ls eif(c ntB it s==0)
{unic = UTF C2UniC(utf_data, ptr, cntBits);++ptr;
}e ls e
{unic = UTF C2UniC(utf_data, ptr, cntBits);ptr+=cntBits;
}unis.append(unic);
}return unis.toString();
}
/**
5
*将指定的UTF-8字节组合成一个Unic o de编码字符
*@param utf byte[] -UTF-8字节数组
*@param sptr int-编码字节起始位置
*@param cntBits int-编码字节数
*@return char-变换后的Unicode字符
*/public static char UTFC2UniC(byte[] utf, int sptr, intcntBits)
{
/*
U nico de<->U TF-8
U-00000000-U-0000007F: 0 xxxx x xx
U-00000080-U-000007FF: 110xxxxx 10xxxxxx
6
U-00000800-U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000-U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx10 xxx x xx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
*/int uniC=0; // represent theunicode char byte firstByte=utf[sptr];int ptr=0; // pointer 0~15
//resolve single byte UTF-8 encoding charif(c ntB it s==0)return(char)firstByte;
//resolve the first byte
7
firstByte&=(1<< (7-c ntBits)) - 1;
// resolve multiple bytes UTF-8 encoding char(except thefirst byte)fo r(int i=sptr+c ntBits -1; i> sptr; --i)
{byte utfb=utf[i];uniC|=(utfb&0x3 f)<<ptr;ptr+=6;
}uniC|=firstByte<<ptr;return(char)uniC;
}
//根据给定字节计算U TF-8编码的一个字符所占字节数
//U TF-8规则定义字节标记只能为0或2~6private static int getCntBits(byte b)
{int cnt=0;
8
if(b==0)re t u rn-1;for(int i=7; i>=0; --i)
{if(((b&g t;&g t; i)&0 x 1)==1)
++c nt;e ls ebreak;
}return(c nt>6| |c nt==1)?-1 : c nt;
}
参考资料
《 UTF-8 and Unicode FAQ 》 ——http://www.linuxfo rum.net/books/UTF-8-Unicode.html
百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网92to.com,您的在线图书馆
9
创梦网络怎么样,创梦网络公司位于四川省达州市,属于四川本地企业,资质齐全,IDC/ISP均有,从创梦网络这边租的服务器均可以****,属于一手资源,高防机柜、大带宽、高防IP业务,另外创梦网络近期还会上线四川眉山联通、广东优化线路高防机柜,CN2专线相关业务。广东电信大带宽近期可以预约机柜了,成都优化线路,机柜租用、服务器云服务器租用,适合建站做游戏,不须要在套CDN,全国访问快,直连省骨干,大网...
hostslim美国独立日活动正在进行中,针对一款大硬盘荷兰专用服务器:双E5-2620v2/4x 1TB SATA硬盘,活动价60美元月。HostSlim荷兰服务器允许大人内容,不过只支持电汇、信用卡和比特币付款,商家支持7天内退款保证,有需要欧洲服务器的可以入手试试,记得注册的时候选择中国,这样不用交20%的税。hostslim怎么样?HostSlim是一家成立于2008年的荷兰托管服务器商,...
Krypt这两天发布了ION平台9月份优惠信息,提供一款特选套餐年付120美元(原价$162/年),开设在洛杉矶或者圣何塞机房,支持Windows或者Linux操作系统。ion.kryptcloud.com是Krypt机房上线的云主机平台,主要提供基于KVM架构云主机产品,相对于KT主站云服务器要便宜很多,产品可选洛杉矶、圣何塞或者新加坡等地机房。洛杉矶机房CPU:2 cores内存:2GB硬盘:...