常用编码详解
2007-07-21 21:36:06 来源:WEB开发网核心提示: 3)从编码序列分配位到UCS-4字符,首先从序列最后一个8比特字节的最低位开始,常用编码详解(4),接着向左进行,直到所有标记为x的位完成,它可能导致安全问题或其他问题(比如把0当作数组结束标志),更详细的算法和公式可以在[FSS_UTF],如果UTF-8序列长度不大于3个8比特字节,解码
3)从编码序列分配位到UCS-4字符。首先从序列最后一个8比特字节的最低位开始,接着向左进行,直到所有标记为x的位完成。如果UTF-8序列长度不大于3个8比特字节,解码过程可以直接赋予UCS-2。
WCHAR UTF8ToUnicode(unsigned char *buffer)
{
WCHAR temp = 0;
if (buffer[0] < 0x80) // one char of UTF8
{
temp = buffer[0];
}
if ((0xc0 <= buffer[0]) && (buffer[0] < 0xe0)) // two char of UTF8
{
temp = buffer[0] & 0x1f;
temp = temp << 6;
temp = temp | (buffer[1] & 0x3f);
}
if ((0xe0 <= buffer[0]) && (buffer[0] < 0xf0)) // three char of UTF8
{
temp = buffer[0] & 0x0f;
temp = temp << 6;
temp = temp | (buffer[1] & 0x3f);
temp = temp << 6;
temp = temp | (buffer[2] & 0x3f);
}
if ((0x80 <= buffer[0]) && (buffer[0] < 0xc0)) // not the first byte of UTF8 character
return 0xfeff; // 0xfeff will never appear in usual
return temp; // more than 3-bytes return 0
}
注意:上面解码算法的实际实现应该进行安全保护,以便处理解码无效的系列。例如:实现可能(错误)解码无效的UTF-8系列0xC0 0x80为字符U+0000,它可能导致安全问题或其他问题(比如把0当作数组结束标志)。更详细的算法和公式可以在[FSS_UTF],[UNICODE] 或[ISO-10646]附录R中找到。
更多精彩
赞助商链接