龍飛鳳舞振家聲 |
招牌一出棟天庭 |
『龍飛鳳舞』指『喫夜粥練硬對拳頭』
『招牌』指『洪門』
『棟』指『棟穿』
『天庭』指『满清』
BOOKCARD
龍飛鳳舞振家聲 |
招牌一出棟天庭 |
『龍飛鳳舞』指『喫夜粥練硬對拳頭』
『招牌』指『洪門』
『棟』指『棟穿』
『天庭』指『满清』
3D打印機濟出頭,步進摩達衰老斷線,濟出唔匀,導至氣窿,Y軸偏移.
采用『PH2.0MM-6P』『PH2.0插針』.用熱缩管包露銅線, 收屘『热熔胶固定』排線.
買雜牌『B450-ITX』配『RYZEN5-1500X』砌臺ITX,摆係老竇屋企睇片.
點知『BE200』WIFI吾認識.篮牙要更新BIOS.
SSD磁盤冇法指盤符,要装最新版Windows10-22H2.
之前係老竇屋企砌臺ITX電腦愛蒞睇片,『BE200』新出買蒞試試, 點知係係『b450-itx』可以認藍牙,唔認WIFI.反而係『x99-itx』藍牙WIFI都認.
唯有『AX210』配『b450-itx』, 『BE200』配『x99-itx』.
下載最新Intel WiFi驅動.
睇到摩記早年出android手幾『Droid 3』,側滑鍵盤設計,绝版手機. 買蒞測試android程式.
『Droid 3』設debug模式
Photoshop係轉存256色『索引色』時,除『背影透明』圖像邊緣生產白毛.
登入Win10間謁會TeeDriverW8x64.sys蓝屏, 聽聞禁節能模式可修复,『CPU C3 report』『CPU C6 report』.
係電腦發展初時定義左套『ASCII碼』,得128字符,英文加數字用單字節BYTE. 後蒞各國皆自定『字符編碼』,『Shift-JIS/EUC-KR/BIG5/GB2312』皆占两字節WORD,结果係編碼重叠.所以先有亂碼.
字 | Low 8bit | Height 8bit |
ASCII-128 | 0 ~ 0x7F | N/A |
BIG5漢字 | 0xA1 ~ 0xF9 | 0x40 ~ 0x7E
0xA1 ~ 0xFE |
SHIFT-JIS日字 | 0x81~0x9f
0xe0~0xef |
0x40~0x7e
0x80~0xfc |
EUC-KR韓字 | 0xA1~0xFE | 0xA1~0xFE |
GB2312中字 | 0xA1 ~ 0xF7 | 0xA1 ~ 0xFE |
GBK中字 | 0x81 ~ 0xFE | 0x40 ~ 0xFE |
『UTF-8』係Unicode『萬國碼』變體,首byte前缀標記字符長度.前缀0長度1, 前缀110長度2, 前缀1110長度3.以此类推.尾随byte前缀皆標記01.
『UTF-8』bin | 長度 |
bin:0xxxxxxx | 1 |
bin:110xxxxx 10xxxxxx | 2 |
bin:1110xxxx 10xxxxxx 10xxxxxx | 3 |
bin:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4 |
bin:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 5 |
bin:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 6 |
UTF-8判定
if ((utf8[0] & 0x80) == 0x00)
return 1; |
值小於0x80的ASCII字元 |
if ((utf8[0] & 0xE0) == 0xC0 &&
(utf8[1] & 0xC0) == 0x80) return 2; |
2字節UTF-8字符 |
if ((utf8[0] & 0xF0) == 0xE0 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) return 3; |
3字節UTF-8字符 |
if ((utf8[0] & 0xF8) == 0xF0 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) return 4; |
4字節UTF-8字符 |
if ((utf8[0] & 0xFC) == 0xF8 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) return 5; |
5字節UTF-8字符 |
if ((utf8[0] & 0xFE) == 0xFC &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) return 6; |
6字节UTF-8字符 |
值小於0x80係ASCII字符集
if ((string[0] & 0x80) == 0x00)
return 1; |
BIG5漢字符集編碼范圍
if ((string[0] >= 0xA1 && string[0] <= 0xF9) &&
(string[1] >= 0x40 && string[1] <= 0x7E || string[1] >= 0xA1 && string[1] <= 0xFE) ) return 2; |
SHIFT-JIS日字符集編碼范圍
if ((string[0] >= 0x81 && string[0] <= 0xF9 ||
string[0] >= 0xe0 && string[0] <= 0xef) && (string[1] >= 0x40 && string[1] <= 0x7E || string[1] >= 0xA1 && string[1] <= 0xFE) ) return 2; |
EUC-KR韓字符集編碼范圍
if ((string[0] >= 0xA1 && string[0] <= 0xFE) &&
(string[1] >= 0xA1 && string[1] <= 0xFE)) return 2; |
GB2312中字符集編碼范圍
if ((string[0] >= 0xA1 && string[0] <= 0xF7) &&
(string[1] >= 0XA1 && string[1] <= 0XFE) ) return 2; |
GBK中字符集編碼范圍
if ((string[0] >= 0x81 && string[0] <= 0xFE) &&
(string[1] >= 0XA0 && string[1] <= 0XFE) ) return 2; |
係電腦發展初時.定義左套『ASCII碼』,得128字符,英文加數字用單字節BYTE. 後蒞各國皆自定『字符編碼』,『BIG5/GB2312』皆占两字節WORD,结果係編碼重叠.所以先有亂碼.
UNICODE『萬國碼』,各國各自有獨立編碼段,吾重叠,同『ASCII碼』兼容.
『UNICODE』係設計之初每字符占『2 BYTE』即『USC2』字符集. 但係『2 BYTE』够支持65535字符.所以後蒞有『USC4』占『4 BYTE』.
係同壹字符串USC2同USC4會混合出現.
但係『ASCII碼』只需單字節『1 BYTE』. 所以發明左『UTF-8』以節約地方.
『UTF-8』同『UNICODE』按照下表互為轉换.
Unicode『USC2』字符集HEX | 『UTF-8』bin |
0x0000~0x007F | 0xxxxxxx |
0x0080~0x07FF | 110xxxxx 10xxxxxx |
0x0800~0xFFFF | 1110xxxx 10xxxxxx 10xxxxxx |
為左係同壹字符串『USC2』同『USC4』混合出現.係『USC4』字符『低16bit』同『高16bit』分別加前缀標記.
『低16bit』加『0xD800』,『高16bit』加『0xDC00』,再加壹區域0x10000.
前缀標記『0xD800』『0xDC00』各占6bit,各净低10bit加埋有『20bit』.够支持 『1048576』字符
USC4-低16bit前缀標記 | 0xD800 | BIN:110110 00000 00000 |
USC4-高16bit前缀標記 | 0xDC00 | BIN:110111 00000 00000 |
USC4 | 前缀標記 | USC4=前缀標記+字符 |
低16bit | 0xD800 | BIN:110110 00000 00000 + BIN:xxxxxxxxxx |
高16bit | 0xDC00 | BIN:110111 00000 00000 + BIN:xxxxxxxxxx |
utf8 轉 usc4
首字節 | value = utf8[sour] & (0xFF >> (bytes + 1));
++sour; |
尾随字節 | for (int i = 1; i < bytes; ++i) {
value = value << 6; value = value | (utf8[sour] & 0x3f);// 提低6bit ++sour; } |
减壹區域 | value = value – 0x10000 |
低16bit | unicode[dest] = 0xD800 | ((value >> 10) & 0x3ff ); |
高16bit | unicode[dest+1] = 0xDC00 | ((value) & 0x3ff);
dest = dest + 2; |
utf8 轉 usc2
首字節 | value = utf8[sour] & (0xFF >> (bytes + 1));
++sour; |
尾随字節 | for (int i = 1; i < bytes; ++i) {
value = value << 6; value = value | (utf8[sour] & 0x3f); ++sour; } |
反轉字節 | v = (value >> 24) & 0xFF;
unicode[dest] = v; v = (value >> 16) & 0xFF; if (v != 0) { unicode[dest] = (unicode[dest] << 8) + v; ++dest; } |
反轉字節 | v = (value >> 8) & 0xFF;
unicode[dest] = v; v = value & 0xFF; if (v != 0) { unicode[dest] = (unicode[dest] << 8) + v; ++dest; } |
Usc4轉utf8
提取字符 | value = (unicode[sour] – 0xD800) << 10 | (unicode[sour + 1] – 0xDC00); |
加壹區域 | value = value + 0x10000; |
Usc2轉utf8
提取字符 | value = unicode[sour]; |
首字節 | utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6));
++dest; |
尾随字節 | for (int i = 1; i < bytes; ++i) {
utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F); ++dest; } ++sour; |
『UTF-8』首byte,前缀標記字符長度. 前缀0長度1, 前缀110長度2, 前缀1110長度3. 以此类推.尾随byte前缀皆標記01.
『UTF-8』bin | 長度 |
bin:0xxxxxxx | 1 |
bin:110xxxxx 10xxxxxx | 2 |
bin:1110xxxx 10xxxxxx 10xxxxxx | 3 |
bin:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4 |
bin:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 5 |
bin:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 6 |
按首BIT符號,計算UTF8字符長度,返回0非UFT8字符.
『UTF-8』字符 | |
if ((utf8[0] & 0x80) == 0x00)
return 1; |
0xxxxxxx |
if ((utf8[0] & 0xE0) == 0xC0 &&
(utf8[1] & 0xC0) == 0x80) return 2; |
110xxxxx 10xxxxxx |
if ((utf8[0] & 0xF0) == 0xE0 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) return 3; |
1110xxxx
10xxxxxx 10xxxxxx |
if ((utf8[0] & 0xF8) == 0xF0 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) return 4; |
11110xxx
10xxxxxx 10xxxxxx 10xxxxxx |
if ((utf8[0] & 0xFC) == 0xF8 &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) return 5; |
111110xx
10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
if ((utf8[0] & 0xFE) == 0xFC &&
(utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) return 6; |
1111110x
10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
unicode轉utf8 , ASCII碼相等.
int UnicodeToUTF8(char * utf8, const wchar_t * unicode)
{ int unicodeLength = 0; int bytes; int dest, sour; DWORD value; unicodeLength = Unicode_Length(unicode) ; sour = dest = 0; while (sour < unicodeLength) { bytes = 1; if (unicode[sour] >= 0xD800 && unicode[sour + 1] >= 0xDC00) bytes = 4; else if (unicode[sour] >= 0x00 && unicode[sour] <= 0x7F) bytes = 1; else if (unicode[sour] >= 0x80 && unicode[sour] <= 0x7FF) bytes = 2; else if (unicode[sour] >= 0x800 && unicode[sour] <= 0xFFFF) bytes = 3; else if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x10000 && ((unicode[sour + 1] << 16) | unicode[sour]) <= 0x1FFFFF) bytes = 4; else if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x200000 && ((unicode[sour + 1] << 16) | unicode[sour]) <= 0x3FFFFFF) bytes = 5; else if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x4000000 && ((unicode[sour + 1] << 16) | unicode[sour]) <= 0x7FFFFFFF) bytes = 6; else if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x80000000) bytes = 7;
if (bytes == 1) { utf8[dest] = unicode[sour]; ++dest; ++sour; } else if (unicode[sour] >= 0xD800 && unicode[sour + 1] >= 0xDC00) { value = (unicode[sour] – 0xD800) << 10 | (unicode[sour + 1] – 0xDC00); value = value + 0x10000; utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6)); ++dest; for (int i = 1; i < bytes; ++i) { utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F); ++dest; } sour = sour + 2; } else if (bytes == 2 || bytes == 3) { value = unicode[sour]; utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6)); ++dest; for (int i = 1; i < bytes; ++i) { utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F); ++dest; } ++sour; } else if (bytes >= 4) { value = (unicode[sour + 1] << 16) | unicode[sour]; utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6)); ++dest; for (int i = 1; i < bytes; ++i) { utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F); ++dest; } sour = sour + 2; } } utf8[dest] = NULL; return dest; } |
utf8 轉 unicode
int UTF8ToUnicode(wchar_t * unicode, const char* utf8)
{ int utf8Length; int sour, dest; int bytes; dest = sour = 0; DWORD value; BYTE v; utf8Length = strlen(utf8); while (sour < utf8Length) { if ((utf8[sour] & 0x80) == 0x00) bytes = 1; else if ((utf8[sour] & 0xE0) == 0xC0) bytes = 2; else if ((utf8[sour] & 0xF0) == 0xE0) bytes = 3; else if ((utf8[sour] & 0xF8) == 0xF0) bytes = 4; else if ((utf8[sour] & 0xFC) == 0xF8) bytes = 5; else if ((utf8[sour] & 0xFE) == 0xFC) bytes = 6; else bytes = 7; if (bytes == 1) { unicode[dest] = utf8[sour]; ++dest; ++sour; } else if (bytes == 2 || bytes == 3) { value = utf8[sour] & (0xFF >> (bytes + 1)); ++sour; for (int i = 1; i < bytes; ++i) { value = value << 6; value = value | (utf8[sour] & 0x3f); ++sour; }
v = (value >> 24) & 0xFF; unicode[dest] = v; v = (value >> 16) & 0xFF; if (v != 0) { unicode[dest] = (unicode[dest] << 8) + v; ++dest; }
v = (value >> 8) & 0xFF; unicode[dest] = v; v = value & 0xFF; if (v != 0) { unicode[dest] = (unicode[dest] << 8) + v; ++dest; } } else if (bytes >= 4 ) { value = utf8[sour] & (0xFF >> (bytes + 1)); ++sour; for (int i = 1; i < bytes; ++i) { value = value << 6; value = value | (utf8[sour] & 0x3f); ++sour; } value = value – 0x10000; unicode[dest] = 0xD800 | ((value >> 10) & 0x3ff ); unicode[dest+1] = 0xDC00 | ((value) & 0x3ff); dest = dest + 2; } }
unicode[dest] = NULL; return dest; } |
你必須登入才能發表留言。