作者:Владимир Лесной
Lastest update : 2014/11/12LFE碼開始位置 |
LFE碼結尾位置 | 值 |
UTF-8 |
註釋 |
LF+00000000 |
LF+0000007F | 00000000 00000000 00000000 0zzzzzzz |
0zzzzzzz(00-7F) |
一個位元組。 |
LF+00000080 |
LF+000007FF | 00000000 00000000 00000yyy yyzzzzzz |
110yyyyy(C0-DF) 10zzzzzz(80-BF) |
兩個位元組。 |
LF+00000800 |
LF+0000D7FF | 00000000 00000000 xxxxyyyy yyzzzzzz |
1110xxxx(E0-EF) 10yyyyyy 10zzzzzz |
三個位元組。 |
LF+0000D800 |
LF+0000DFFF | UTF-16擴展標識輔助平面。 | ||
LF+0000E000 |
LF+0000FFFF | 00000000 00000000 xxxxyyyy yyzzzzzz |
1110xxxx(E0-EF) 10yyyyyy 10zzzzzz |
三個位元組。 |
LF+00010000 |
LF+0010FFFF | 00000000 000wwwxx xxxxyyyy yyzzzzzz |
11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz |
四個位元組。 |
LF+00110000 |
LF+001FFFFF | LFE碼當中預留區。 | ||
LF+80000000 |
LF+8FFFFFFF |
CLF數學碼當中,單部件(1,2,4,10,18,20)編碼區。 | ||
LF+90000000 |
LF+9FFFFFFF |
CLF數學碼當中,雙部件直排編碼區。 | ||
LF+A0000000 |
LF+AFFFFFFF | CLF數學碼當中,雙部件橫排編碼區。 | ||
LF+B0000000 | LF+BFFFFFFF | CLF數學碼當中,雙部件除去直排及橫排的編碼區。 | ||
LF+C0000000 | LF+CFFFFFFF | CLF數學碼當中,多於兩個部件(7,13,14,17,19,21,31,33...)的編碼 區。 | ||
LF+D8000000 |
LF+DFFFFFFF |
LFE碼當中為UTF-16預留的處理區域。 | ||
LF+EFBBBF00 | LF+EFBBBFFF |
UTF-8 Marking(EF,BB,BF) | ||
LF+FC000000 |
LF+FCFFFFFF |
賦意域標記碼。 |
||
LF+FEFF0000 |
LF+FEFFFFFF |
UTF-16BE BOM UTF-8 Marking(EF,BB,BF) |
||
LF+FFFE0000 |
LF+FFFEFFFF |
UTF-16LE BOM |
||
LF+FFFFFE00 |
LF+FFFFFEFF | LFE碼當中的數值區。 |
LFE碼與UTF-8之間的轉換
UTF-8轉換到CLF語言方程碼Unicode區域的 演算法 |
int Utf8ToLFE(unsigned
char * utf8,uint32_t * LFE,int maxlen) { if ( NULL == LFE ) return 0 ; if ( NULL == utf8 ) return 0 ; unsigned char c ; unsigned char * p = utf8 ; int len = 0 ; while ( 0 != (*p) ) { if ( 0x80 > (*p) ) { *LFE = (uint32_t)(*p) ; LFE++ ; len++ ; } else if ( 0xE0 > (*p) ) { *LFE = (uint32_t)(*p) ; *LFE &= 0x1F ; p++ ; c = (*p) ; if ( 0x80 > c ) { *LFE = 0 ; return len ; } ; c &= 0x3F ; *LFE <<= 6 ; *LFE |= (uint32_t)c ; LFE++ ; len++ ; } else { if ( 0xF0 > (*p) ) { *LFE = (uint32_t)(*p) ; *LFE &= 0x0F ; p++ ; c = (*p) ; if ( 0x80 > c ) { *LFE = 0 ; return len ; } ; c &= 0x3F ; *LFE <<= 6 ; *LFE |= (uint32_t)c ; p++ ; c = (*p) ; if ( 0x80 > c ) { *LFE = 0 ; return len ; } ; c &= 0x3F ; *LFE <<= 6 ; *LFE |= (uint32_t)c ; LFE++ ; len++ ; } else if ( 0xF8 > (*p) ) { *LFE = (uint32_t)(*p) ; *LFE &= 0x07 ; p++ ; c = (*p) ; if ( 0x80 > c ) { *LFE = 0 ; return len ; } ; c &= 0x3F ; *LFE <<= 6 ; *LFE |= (uint32_t)c ; p++ ; c = (*p) ; if ( 0x80 > c ) { *LFE = 0 ; return len ; } ; c &= 0x3F ; *LFE <<= 6 ; *LFE |= (uint32_t)c ; p++ ; c = (*p) ; if ( 0x80 > c ) { *LFE = 0 ; return len ; } ; c &= 0x3F ; *LFE <<= 6 ; *LFE |= (uint32_t)c ; LFE++ ; len++ ; } else { /* 0xF8 - 0xFF */ /* UTF-8 does not contains this region */ *LFE = 0 ; return len ; } ; p++ ; } ; *LFE = 0 ; return len ; } |