文本编码只UTF-8
来源:互联网 发布:银河麒麟知乎 编辑:程序博客网 时间:2024/05/01 21:11
UTF-8是UNICODE的一种变长字符编,其文本开头三个字节为EF BB BF,UTF-8是变长的unicode码,可以转换会unicode码,utf-8文本编码是根据前导有多少个1来决定用多少字符来表示一个字符,比如中国的中字在小端unicode码表示为4e2d,在UTF-8中表示为E4 B8 AD,二进制表示为11100100 10111000 10101101,其中前面的三个111表示用三个字节表示这个字符,后面两个字节的高两位一律为10,第一个字节去高三位 后面两个字节去高两位的10剩下来的就是小端的unicode码。
#include <config.h>#include <encoding_manager.h>#include <string.h>static int isUtf8Coding(unsigned char *pucBufHead);static int Utf8GetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tUtf8EncodingOpr = {.name = "utf-8",.iHeadLen = 3,.isSupport = isUtf8Coding,.GetCodeFrmBuf = Utf8GetCodeFrmBuf,};static int isUtf8Coding(unsigned char *pucBufHead){const char aStrUtf8[] = {0xEF, 0xBB, 0xBF, 0};if (strncmp((const char*)pucBufHead, aStrUtf8, 3) == 0){/* UTF-8 */return 1;}else{return 0;}}//utf-8文本编码是根据前导有多少个1来决定用多少字符来表示一个字符 /* 获得前导为1的位的个数 * 比如二进制数 11001111 的前导1有2位 * 11100001 的前导1有3位 */static int GetPreOneBits(unsigned char ucVal){int i;int j = 0;for (i = 7; i >= 0; i--){if (!(ucVal & (1<<i)))break;elsej++;}return j;}static int Utf8GetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){#if 0 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符; 如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码; 如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示; 如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示; 如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示; 因此,对UTF-8编码中的任意字节,根据第一位,可判断是否为ASCII字符; 根据前二位,可判断该字节是否为一个字符编码的第一个字节; 根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示; 根据前五位(如果前四位为1),可判断编码是否有错误或数据传输过程中是否有错误。#endifint i;int iNum;unsigned char ucVal;unsigned int dwSum = 0;if (pucBufStart >= pucBufEnd){/* 文件结束 */return 0;}ucVal = pucBufStart[0];iNum = GetPreOneBits(pucBufStart[0]);if ((pucBufStart + iNum) > pucBufEnd){/* 文件结束 */return 0;}if (iNum == 0){/* ASCII */*pdwCode = pucBufStart[0];return 1;}else{//提取出unicode码ucVal = ucVal << iNum;ucVal = ucVal >> iNum;dwSum += ucVal;for (i = 1; i < iNum; i++){ucVal = pucBufStart[i] & 0x3f;dwSum = dwSum << 6;dwSum += ucVal;}*pdwCode = dwSum;return iNum;}}int Utf8EncodingInit(void){AddFontOprForEncoding(&g_tUtf8EncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tUtf8EncodingOpr, GetFontOpr("ascii"));return RegisterEncodingOpr(&g_tUtf8EncodingOpr);}
- 文本编码只UTF-8
- php json_encode只支持utf-8编码
- 读取utf-8等编码的文本
- ANSI和UTF-8文本编码
- UNICODE GBK UTF-8等文本编码
- 使用文本编辑器将字符转换成UTF-8编码
- ANSI和UTF-8文本编码的体积比较
- Eclipse文本编码格式修改为UTF-8 的方法
- 默认新建文本文档编码为UTF-8格式
- 普通的文本文档怎么更换成UTF-8编码?
- 将eclipse文本编码格式修改为UTF-8
- UNICODE GBK UTF-8等文本编码(理解+实践)
- linux 批量转换文本编码为UTF-8
- VS中 修改文本编码格式 为"UTF-8"
- Eclipse文本编码格式修改为UTF-8
- eclipse文本编码格式修改为UTF-8
- utf-8编码下替换指定文本内容源码
- 指定输出文本为utf-8编码格式
- JAVA socket编程实例
- 从eclipse导入工程到myeclipse,不能部署到tomcat根目录下的解决方案
- 用迭代创建联级目录
- Qt网络获取本机网络信息
- 是页面所有元素disabled 属性失效和生效的javascript
- 文本编码只UTF-8
- stl 容器适配器、迭代器适配器和函数适配器讲解
- ASP.NET工程中发布前有文件夹,发布后就不见了的解决办法
- 计算差三角
- Eclipse web工程导入到myeclipse中Tomcat不能直接部署之解决方法
- VPN拨号
- 管道
- 差分约束2
- ORANGE'S之三-保护模式(3)