utf8.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 2,062 行 · 第 1/5 页
C
2,062 行
/* 1110abcd 10efghij 10klmnop -> abcdefgh ijklmnop */ outBuf[len+H_0] = ((inBuf[i+0] & 0x0F) << 4) | ((inBuf[i+1] & 0x3C) >> 2); outBuf[len+H_1] = ((inBuf[i+1] & 0x03) << 6) | ((inBuf[i+2] & 0x3F) >> 0); i += 3; len += 2;#ifdef UTF16 } else if( (inBuf[i] & 0xF8) == 0xF0 ) { int abcde, BCDE; if( (inBuf[i+1] & 0xC0) != 0x80 ) return PR_FALSE; if( (inBuf[i+2] & 0xC0) != 0x80 ) return PR_FALSE; if( (inBuf[i+3] & 0xC0) != 0x80 ) return PR_FALSE; /* 0001 0000-001F FFFF <- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx -> [D800-DBFF] [DC00-DFFF] */ /* 11110abc 10defghi 10jklmno 10pqrstu -> { Let 0BCDE = abcde - 1 } 110110BC DEfghijk 110111lm nopqrstu */ abcde = ((inBuf[i+0] & 0x07) << 2) | ((inBuf[i+1] & 0x30) >> 4); BCDE = abcde - 1;#ifndef TEST_UTF8 PORT_Assert(BCDE < 0x10); /* should have been caught above */#endif /* TEST_UTF8 */ outBuf[len+0+H_0] = 0xD8 | ((BCDE & 0x0C) >> 2); outBuf[len+0+H_1] = ((BCDE & 0x03) << 6) | ((inBuf[i+1] & 0x0F) << 2) | ((inBuf[i+2] & 0x30) >> 4); outBuf[len+2+H_0] = 0xDC | ((inBuf[i+2] & 0x0C) >> 2); outBuf[len+2+H_1] = ((inBuf[i+2] & 0x03) << 6) | ((inBuf[i+3] & 0x3F) >> 0); i += 4; len += 4;#endif /* UTF16 */ } else return PR_FALSE; } *outBufLen = len; return PR_TRUE; } else { unsigned int i, len = 0; for( i = 0; i < inBufLen; i += 2 ) { if( (inBuf[i+H_0] == 0x00) && ((inBuf[i+H_0] & 0x80) == 0x00) ) len += 1; else if( inBuf[i+H_0] < 0x08 ) len += 2;#ifdef UTF16 else if( ((inBuf[i+0+H_0] & 0xDC) == 0xD8) ) { if( ((inBuf[i+2+H_0] & 0xDC) == 0xDC) && ((inBufLen - i) > 2) ) { i += 2; len += 4; } else { return PR_FALSE; } }#endif /* UTF16 */ else len += 3; } if( len > maxOutBufLen ) { *outBufLen = len; return PR_FALSE; } len = 0; for( i = 0; i < inBufLen; i += 2 ) { if( (inBuf[i+H_0] == 0x00) && ((inBuf[i+H_1] & 0x80) == 0x00) ) { /* 0000-007F -> 0xxxxxx */ /* 00000000 0abcdefg -> 0abcdefg */ outBuf[len] = inBuf[i+H_1] & 0x7F; len += 1; } else if( inBuf[i+H_0] < 0x08 ) { /* 0080-07FF -> 110xxxxx 10xxxxxx */ /* 00000abc defghijk -> 110abcde 10fghijk */ outBuf[len+0] = 0xC0 | ((inBuf[i+H_0] & 0x07) << 2) | ((inBuf[i+H_1] & 0xC0) >> 6); outBuf[len+1] = 0x80 | ((inBuf[i+H_1] & 0x3F) >> 0); len += 2;#ifdef UTF16 } else if( (inBuf[i+H_0] & 0xDC) == 0xD8 ) { int abcde, BCDE;#ifndef TEST_UTF8 PORT_Assert(((inBuf[i+2+H_0] & 0xDC) == 0xDC) && ((inBufLen - i) > 2));#endif /* TEST_UTF8 */ /* D800-DBFF DC00-DFFF -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ /* 110110BC DEfghijk 110111lm nopqrstu -> { Let abcde = BCDE + 1 } 11110abc 10defghi 10jklmno 10pqrstu */ BCDE = ((inBuf[i+H_0] & 0x03) << 2) | ((inBuf[i+H_1] & 0xC0) >> 6); abcde = BCDE + 1; outBuf[len+0] = 0xF0 | ((abcde & 0x1C) >> 2); outBuf[len+1] = 0x80 | ((abcde & 0x03) << 4) | ((inBuf[i+0+H_1] & 0x3C) >> 2); outBuf[len+2] = 0x80 | ((inBuf[i+0+H_1] & 0x03) << 4) | ((inBuf[i+2+H_0] & 0x03) << 2) | ((inBuf[i+2+H_1] & 0xC0) >> 6); outBuf[len+3] = 0x80 | ((inBuf[i+2+H_1] & 0x3F) >> 0); i += 2; len += 4;#endif /* UTF16 */ } else { /* 0800-FFFF -> 1110xxxx 10xxxxxx 10xxxxxx */ /* abcdefgh ijklmnop -> 1110abcd 10efghij 10klmnop */ outBuf[len+0] = 0xE0 | ((inBuf[i+H_0] & 0xF0) >> 4); outBuf[len+1] = 0x80 | ((inBuf[i+H_0] & 0x0F) << 2) | ((inBuf[i+H_1] & 0xC0) >> 6); outBuf[len+2] = 0x80 | ((inBuf[i+H_1] & 0x3F) >> 0); len += 3; } } *outBufLen = len; return PR_TRUE; }}#ifdef TEST_UTF8#include <stdio.h>#include <string.h>#include <stdlib.h>#include <netinet/in.h> /* for htonl and htons *//* * UCS-4 vectors */struct ucs4 { PRUint32 c; char *utf8;};/* * UCS-2 vectors */struct ucs2 { PRUint16 c; char *utf8;};#ifdef UTF16/* * UTF-16 vectors */struct utf16 { PRUint32 c; PRUint16 w[2];};#endif /* UTF16 *//* * UCS-4 vectors */struct ucs4 ucs4[] = { { 0x00000001, "\x01" }, { 0x00000002, "\x02" }, { 0x00000003, "\x03" }, { 0x00000004, "\x04" }, { 0x00000007, "\x07" }, { 0x00000008, "\x08" }, { 0x0000000F, "\x0F" }, { 0x00000010, "\x10" }, { 0x0000001F, "\x1F" }, { 0x00000020, "\x20" }, { 0x0000003F, "\x3F" }, { 0x00000040, "\x40" }, { 0x0000007F, "\x7F" }, { 0x00000080, "\xC2\x80" }, { 0x00000081, "\xC2\x81" }, { 0x00000082, "\xC2\x82" }, { 0x00000084, "\xC2\x84" }, { 0x00000088, "\xC2\x88" }, { 0x00000090, "\xC2\x90" }, { 0x000000A0, "\xC2\xA0" }, { 0x000000C0, "\xC3\x80" }, { 0x000000FF, "\xC3\xBF" }, { 0x00000100, "\xC4\x80" }, { 0x00000101, "\xC4\x81" }, { 0x00000102, "\xC4\x82" }, { 0x00000104, "\xC4\x84" }, { 0x00000108, "\xC4\x88" }, { 0x00000110, "\xC4\x90" }, { 0x00000120, "\xC4\xA0" }, { 0x00000140, "\xC5\x80" }, { 0x00000180, "\xC6\x80" }, { 0x000001FF, "\xC7\xBF" }, { 0x00000200, "\xC8\x80" }, { 0x00000201, "\xC8\x81" }, { 0x00000202, "\xC8\x82" }, { 0x00000204, "\xC8\x84" }, { 0x00000208, "\xC8\x88" }, { 0x00000210, "\xC8\x90" }, { 0x00000220, "\xC8\xA0" }, { 0x00000240, "\xC9\x80" }, { 0x00000280, "\xCA\x80" }, { 0x00000300, "\xCC\x80" }, { 0x000003FF, "\xCF\xBF" }, { 0x00000400, "\xD0\x80" }, { 0x00000401, "\xD0\x81" }, { 0x00000402, "\xD0\x82" }, { 0x00000404, "\xD0\x84" }, { 0x00000408, "\xD0\x88" }, { 0x00000410, "\xD0\x90" }, { 0x00000420, "\xD0\xA0" }, { 0x00000440, "\xD1\x80" }, { 0x00000480, "\xD2\x80" }, { 0x00000500, "\xD4\x80" }, { 0x00000600, "\xD8\x80" }, { 0x000007FF, "\xDF\xBF" }, { 0x00000800, "\xE0\xA0\x80" }, { 0x00000801, "\xE0\xA0\x81" }, { 0x00000802, "\xE0\xA0\x82" }, { 0x00000804, "\xE0\xA0\x84" }, { 0x00000808, "\xE0\xA0\x88" }, { 0x00000810, "\xE0\xA0\x90" }, { 0x00000820, "\xE0\xA0\xA0" }, { 0x00000840, "\xE0\xA1\x80" }, { 0x00000880, "\xE0\xA2\x80" }, { 0x00000900, "\xE0\xA4\x80" }, { 0x00000A00, "\xE0\xA8\x80" }, { 0x00000C00, "\xE0\xB0\x80" }, { 0x00000FFF, "\xE0\xBF\xBF" }, { 0x00001000, "\xE1\x80\x80" }, { 0x00001001, "\xE1\x80\x81" }, { 0x00001002, "\xE1\x80\x82" }, { 0x00001004, "\xE1\x80\x84" }, { 0x00001008, "\xE1\x80\x88" }, { 0x00001010, "\xE1\x80\x90" }, { 0x00001020, "\xE1\x80\xA0" }, { 0x00001040, "\xE1\x81\x80" }, { 0x00001080, "\xE1\x82\x80" }, { 0x00001100, "\xE1\x84\x80" }, { 0x00001200, "\xE1\x88\x80" }, { 0x00001400, "\xE1\x90\x80" }, { 0x00001800, "\xE1\xA0\x80" }, { 0x00001FFF, "\xE1\xBF\xBF" }, { 0x00002000, "\xE2\x80\x80" }, { 0x00002001, "\xE2\x80\x81" }, { 0x00002002, "\xE2\x80\x82" }, { 0x00002004, "\xE2\x80\x84" }, { 0x00002008, "\xE2\x80\x88" }, { 0x00002010, "\xE2\x80\x90" }, { 0x00002020, "\xE2\x80\xA0" }, { 0x00002040, "\xE2\x81\x80" }, { 0x00002080, "\xE2\x82\x80" }, { 0x00002100, "\xE2\x84\x80" }, { 0x00002200, "\xE2\x88\x80" }, { 0x00002400, "\xE2\x90\x80" }, { 0x00002800, "\xE2\xA0\x80" }, { 0x00003000, "\xE3\x80\x80" }, { 0x00003FFF, "\xE3\xBF\xBF" }, { 0x00004000, "\xE4\x80\x80" }, { 0x00004001, "\xE4\x80\x81" }, { 0x00004002, "\xE4\x80\x82" }, { 0x00004004, "\xE4\x80\x84" }, { 0x00004008, "\xE4\x80\x88" }, { 0x00004010, "\xE4\x80\x90" }, { 0x00004020, "\xE4\x80\xA0" }, { 0x00004040, "\xE4\x81\x80" }, { 0x00004080, "\xE4\x82\x80" }, { 0x00004100, "\xE4\x84\x80" }, { 0x00004200, "\xE4\x88\x80" }, { 0x00004400, "\xE4\x90\x80" }, { 0x00004800, "\xE4\xA0\x80" }, { 0x00005000, "\xE5\x80\x80" }, { 0x00006000, "\xE6\x80\x80" }, { 0x00007FFF, "\xE7\xBF\xBF" }, { 0x00008000, "\xE8\x80\x80" }, { 0x00008001, "\xE8\x80\x81" }, { 0x00008002, "\xE8\x80\x82" }, { 0x00008004, "\xE8\x80\x84" }, { 0x00008008, "\xE8\x80\x88" }, { 0x00008010, "\xE8\x80\x90" }, { 0x00008020, "\xE8\x80\xA0" }, { 0x00008040, "\xE8\x81\x80" }, { 0x00008080, "\xE8\x82\x80" }, { 0x00008100, "\xE8\x84\x80" }, { 0x00008200, "\xE8\x88\x80" }, { 0x00008400, "\xE8\x90\x80" }, { 0x00008800, "\xE8\xA0\x80" }, { 0x00009000, "\xE9\x80\x80" }, { 0x0000A000, "\xEA\x80\x80" }, { 0x0000C000, "\xEC\x80\x80" }, { 0x0000FFFF, "\xEF\xBF\xBF" }, { 0x00010000, "\xF0\x90\x80\x80" }, { 0x00010001, "\xF0\x90\x80\x81" }, { 0x00010002, "\xF0\x90\x80\x82" }, { 0x00010004, "\xF0\x90\x80\x84" }, { 0x00010008, "\xF0\x90\x80\x88" }, { 0x00010010, "\xF0\x90\x80\x90" }, { 0x00010020, "\xF0\x90\x80\xA0" }, { 0x00010040, "\xF0\x90\x81\x80" }, { 0x00010080, "\xF0\x90\x82\x80" }, { 0x00010100, "\xF0\x90\x84\x80" }, { 0x00010200, "\xF0\x90\x88\x80" }, { 0x00010400, "\xF0\x90\x90\x80" }, { 0x00010800, "\xF0\x90\xA0\x80" }, { 0x00011000, "\xF0\x91\x80\x80" }, { 0x00012000, "\xF0\x92\x80\x80" }, { 0x00014000, "\xF0\x94\x80\x80" }, { 0x00018000, "\xF0\x98\x80\x80" }, { 0x0001FFFF, "\xF0\x9F\xBF\xBF" }, { 0x00020000, "\xF0\xA0\x80\x80" }, { 0x00020001, "\xF0\xA0\x80\x81" }, { 0x00020002, "\xF0\xA0\x80\x82" }, { 0x00020004, "\xF0\xA0\x80\x84" }, { 0x00020008, "\xF0\xA0\x80\x88" }, { 0x00020010, "\xF0\xA0\x80\x90" }, { 0x00020020, "\xF0\xA0\x80\xA0" }, { 0x00020040, "\xF0\xA0\x81\x80" }, { 0x00020080, "\xF0\xA0\x82\x80" }, { 0x00020100, "\xF0\xA0\x84\x80" }, { 0x00020200, "\xF0\xA0\x88\x80" }, { 0x00020400, "\xF0\xA0\x90\x80" }, { 0x00020800, "\xF0\xA0\xA0\x80" }, { 0x00021000, "\xF0\xA1\x80\x80" }, { 0x00022000, "\xF0\xA2\x80\x80" }, { 0x00024000, "\xF0\xA4\x80\x80" }, { 0x00028000, "\xF0\xA8\x80\x80" }, { 0x00030000, "\xF0\xB0\x80\x80" }, { 0x0003FFFF, "\xF0\xBF\xBF\xBF" }, { 0x00040000, "\xF1\x80\x80\x80" }, { 0x00040001, "\xF1\x80\x80\x81" }, { 0x00040002, "\xF1\x80\x80\x82" }, { 0x00040004, "\xF1\x80\x80\x84" }, { 0x00040008, "\xF1\x80\x80\x88" }, { 0x00040010, "\xF1\x80\x80\x90" }, { 0x00040020, "\xF1\x80\x80\xA0" }, { 0x00040040, "\xF1\x80\x81\x80" }, { 0x00040080, "\xF1\x80\x82\x80" }, { 0x00040100, "\xF1\x80\x84\x80" }, { 0x00040200, "\xF1\x80\x88\x80" }, { 0x00040400, "\xF1\x80\x90\x80" }, { 0x00040800, "\xF1\x80\xA0\x80" }, { 0x00041000, "\xF1\x81\x80\x80" }, { 0x00042000, "\xF1\x82\x80\x80" }, { 0x00044000, "\xF1\x84\x80\x80" }, { 0x00048000, "\xF1\x88\x80\x80" }, { 0x00050000, "\xF1\x90\x80\x80" }, { 0x00060000, "\xF1\xA0\x80\x80" }, { 0x0007FFFF, "\xF1\xBF\xBF\xBF" }, { 0x00080000, "\xF2\x80\x80\x80" }, { 0x00080001, "\xF2\x80\x80\x81" }, { 0x00080002, "\xF2\x80\x80\x82" }, { 0x00080004, "\xF2\x80\x80\x84" }, { 0x00080008, "\xF2\x80\x80\x88" }, { 0x00080010, "\xF2\x80\x80\x90" }, { 0x00080020, "\xF2\x80\x80\xA0" }, { 0x00080040, "\xF2\x80\x81\x80" }, { 0x00080080, "\xF2\x80\x82\x80" }, { 0x00080100, "\xF2\x80\x84\x80" }, { 0x00080200, "\xF2\x80\x88\x80" }, { 0x00080400, "\xF2\x80\x90\x80" }, { 0x00080800, "\xF2\x80\xA0\x80" }, { 0x00081000, "\xF2\x81\x80\x80" }, { 0x00082000, "\xF2\x82\x80\x80" }, { 0x00084000, "\xF2\x84\x80\x80" }, { 0x00088000, "\xF2\x88\x80\x80" }, { 0x00090000, "\xF2\x90\x80\x80" }, { 0x000A0000, "\xF2\xA0\x80\x80" }, { 0x000C0000, "\xF3\x80\x80\x80" }, { 0x000FFFFF, "\xF3\xBF\xBF\xBF" }, { 0x00100000, "\xF4\x80\x80\x80" }, { 0x00100001, "\xF4\x80\x80\x81" }, { 0x00100002, "\xF4\x80\x80\x82" }, { 0x00100004, "\xF4\x80\x80\x84" }, { 0x00100008, "\xF4\x80\x80\x88" }, { 0x00100010, "\xF4\x80\x80\x90" }, { 0x00100020, "\xF4\x80\x80\xA0" }, { 0x00100040, "\xF4\x80\x81\x80" }, { 0x00100080, "\xF4\x80\x82\x80" }, { 0x00100100, "\xF4\x80\x84\x80" }, { 0x00100200, "\xF4\x80\x88\x80" }, { 0x00100400, "\xF4\x80\x90\x80" }, { 0x00100800, "\xF4\x80\xA0\x80" }, { 0x00101000, "\xF4\x81\x80\x80" }, { 0x00102000, "\xF4\x82\x80\x80" }, { 0x00104000, "\xF4\x84\x80\x80" }, { 0x00108000, "\xF4\x88\x80\x80" }, { 0x00110000, "\xF4\x90\x80\x80" }, { 0x00120000, "\xF4\xA0\x80\x80" }, { 0x00140000, "\xF5\x80\x80\x80" }, { 0x00180000, "\xF6\x80\x80\x80" }, { 0x001FFFFF, "\xF7\xBF\xBF\xBF" }, { 0x00200000, "\xF8\x88\x80\x80\x80" }, { 0x00200001, "\xF8\x88\x80\x80\x81" }, { 0x00200002, "\xF8\x88\x80\x80\x82" }, { 0x00200004, "\xF8\x88\x80\x80\x84" }, { 0x00200008, "\xF8\x88\x80\x80\x88" },
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?