【Java】ASCII类对ASCII码的处理
文章目錄
- ASCII類
- ASCII碼
- ASCII類中ASCII碼的數值表示
- 剩下的方法
- 總結
ASCII類
java.util.regex.ASCII類是存在的,而且是API文檔查不到的,我們看一下定義:
package java.util.regex;/*** Utility class that implements the standard C ctype functionality.** @author Hong Zhang*/final class ASCII { //... }Utility class that implements the standard C ctype functionality.
(實現標準C ctype功能的實用程序類)
這句話告訴我們這是一個工具類。
final的定義由告訴我們這個類不能被繼承。
由于沒有訪問控制符,所以這是一個包訪問權限的類。
對Java里默認權限和protected權限不清楚的可以看這位“道友”的文章:Java訪問權限
ASCII碼
別問這種問題,我更愿意是沒有人不知道這個……
ASCII 百度百科
ASCII碼知識(自己歸納的)
ASCII類中ASCII碼的數值表示
好的親,請看這些屬性:
static final int UPPER = 0x00000100;static final int LOWER = 0x00000200;static final int DIGIT = 0x00000400;static final int SPACE = 0x00000800;static final int PUNCT = 0x00001000;static final int CNTRL = 0x00002000;static final int BLANK = 0x00004000;static final int HEX = 0x00008000;static final int UNDER = 0x00010000;static final int ASCII = 0x0000FF00;static final int ALPHA = (UPPER|LOWER);static final int ALNUM = (UPPER|LOWER|DIGIT);static final int GRAPH = (PUNCT|UPPER|LOWER|DIGIT);static final int WORD = (UPPER|LOWER|UNDER|DIGIT);static final int XDIGIT = (HEX);解答幾個簡單的問題:
- 0x00000100啥意思?一般人就是直接用十進制,人家全是十六進制。
- 為啥用十六進制?更簡潔的表示二進制。
- 為啥用那么多空余的0?一是對齊,二是Java的int是4字節,32位二進制,對應8位十六進制。
- 為啥用的是1、2、4、8?為了貼合二進制。
- "|"是啥?這不就是很多人從來不用的位運算符嘛……利用硬件資源,算起來更快啊……
- 為啥感覺數值不是連續的啊?本來就不是連續的啊……
這時你說說,強不強?
然后,我們再看另一個static屬性:
private static final int[] ctype = new int[] {CNTRL, /* 00 (NUL) */CNTRL, /* 01 (SOH) */CNTRL, /* 02 (STX) */CNTRL, /* 03 (ETX) */CNTRL, /* 04 (EOT) */CNTRL, /* 05 (ENQ) */CNTRL, /* 06 (ACK) */CNTRL, /* 07 (BEL) */CNTRL, /* 08 (BS) */SPACE+CNTRL+BLANK, /* 09 (HT) */SPACE+CNTRL, /* 0A (LF) */SPACE+CNTRL, /* 0B (VT) */SPACE+CNTRL, /* 0C (FF) */SPACE+CNTRL, /* 0D (CR) */CNTRL, /* 0E (SI) */CNTRL, /* 0F (SO) */CNTRL, /* 10 (DLE) */CNTRL, /* 11 (DC1) */CNTRL, /* 12 (DC2) */CNTRL, /* 13 (DC3) */CNTRL, /* 14 (DC4) */CNTRL, /* 15 (NAK) */CNTRL, /* 16 (SYN) */CNTRL, /* 17 (ETB) */CNTRL, /* 18 (CAN) */CNTRL, /* 19 (EM) */CNTRL, /* 1A (SUB) */CNTRL, /* 1B (ESC) */CNTRL, /* 1C (FS) */CNTRL, /* 1D (GS) */CNTRL, /* 1E (RS) */CNTRL, /* 1F (US) */SPACE+BLANK, /* 20 SPACE */PUNCT, /* 21 ! */PUNCT, /* 22 " */PUNCT, /* 23 # */PUNCT, /* 24 $ */PUNCT, /* 25 % */PUNCT, /* 26 & */PUNCT, /* 27 ' */PUNCT, /* 28 ( */PUNCT, /* 29 ) */PUNCT, /* 2A * */PUNCT, /* 2B + */PUNCT, /* 2C , */PUNCT, /* 2D - */PUNCT, /* 2E . */PUNCT, /* 2F / */DIGIT+HEX+0, /* 30 0 */DIGIT+HEX+1, /* 31 1 */DIGIT+HEX+2, /* 32 2 */DIGIT+HEX+3, /* 33 3 */DIGIT+HEX+4, /* 34 4 */DIGIT+HEX+5, /* 35 5 */DIGIT+HEX+6, /* 36 6 */DIGIT+HEX+7, /* 37 7 */DIGIT+HEX+8, /* 38 8 */DIGIT+HEX+9, /* 39 9 */PUNCT, /* 3A : */PUNCT, /* 3B ; */PUNCT, /* 3C < */PUNCT, /* 3D = */PUNCT, /* 3E > */PUNCT, /* 3F ? */PUNCT, /* 40 @ */UPPER+HEX+10, /* 41 A */UPPER+HEX+11, /* 42 B */UPPER+HEX+12, /* 43 C */UPPER+HEX+13, /* 44 D */UPPER+HEX+14, /* 45 E */UPPER+HEX+15, /* 46 F */UPPER+16, /* 47 G */UPPER+17, /* 48 H */UPPER+18, /* 49 I */UPPER+19, /* 4A J */UPPER+20, /* 4B K */UPPER+21, /* 4C L */UPPER+22, /* 4D M */UPPER+23, /* 4E N */UPPER+24, /* 4F O */UPPER+25, /* 50 P */UPPER+26, /* 51 Q */UPPER+27, /* 52 R */UPPER+28, /* 53 S */UPPER+29, /* 54 T */UPPER+30, /* 55 U */UPPER+31, /* 56 V */UPPER+32, /* 57 W */UPPER+33, /* 58 X */UPPER+34, /* 59 Y */UPPER+35, /* 5A Z */PUNCT, /* 5B [ */PUNCT, /* 5C \ */PUNCT, /* 5D ] */PUNCT, /* 5E ^ */PUNCT|UNDER, /* 5F _ */PUNCT, /* 60 ` */LOWER+HEX+10, /* 61 a */LOWER+HEX+11, /* 62 b */LOWER+HEX+12, /* 63 c */LOWER+HEX+13, /* 64 d */LOWER+HEX+14, /* 65 e */LOWER+HEX+15, /* 66 f */LOWER+16, /* 67 g */LOWER+17, /* 68 h */LOWER+18, /* 69 i */LOWER+19, /* 6A j */LOWER+20, /* 6B k */LOWER+21, /* 6C l */LOWER+22, /* 6D m */LOWER+23, /* 6E n */LOWER+24, /* 6F o */LOWER+25, /* 70 p */LOWER+26, /* 71 q */LOWER+27, /* 72 r */LOWER+28, /* 73 s */LOWER+29, /* 74 t */LOWER+30, /* 75 u */LOWER+31, /* 76 v */LOWER+32, /* 77 w */LOWER+33, /* 78 x */LOWER+34, /* 79 y */LOWER+35, /* 7A z */PUNCT, /* 7B { */PUNCT, /* 7C | */PUNCT, /* 7D } */PUNCT, /* 7E ~ */CNTRL, /* 7F (DEL) */ };這就是一個private的數組,通過之前定義的數值來表示所有的ASCII碼背后的數值。
這個數組里面裝了什么?
| 0(00) | 0x00002000 |
| 1(01) | 0x00002000 |
| 2(02) | 0x00002000 |
| 3(03) | 0x00002000 |
| 4(04) | 0x00002000 |
| 5(05) | 0x00002000 |
| 6(06) | 0x00002000 |
| 7(07) | 0x00002000 |
| 8(08) | 0x00002000 |
| 9(09) | 0x00006800 |
| 10(0A) | 0x00002800 |
| 11(0B) | 0x00002800 |
| 12(0C) | 0x00002800 |
| 13(0D) | 0x00002800 |
| 14(0E) | 0x00002000 |
| 15(0F) | 0x00002000 |
| 16(10) | 0x00002000 |
| 17(11) | 0x00002000 |
| 18(12) | 0x00002000 |
| 19(13) | 0x00002000 |
| 20(14) | 0x00002000 |
| 21(15) | 0x00002000 |
| 22(16) | 0x00002000 |
| 23(17) | 0x00002000 |
| 24(18) | 0x00002000 |
| 25(19) | 0x00002000 |
| 26(1A) | 0x00002000 |
| 27(1B) | 0x00002000 |
| 28(1C) | 0x00002000 |
| 29(1D) | 0x00002000 |
| 30(1E) | 0x00002000 |
| 31(1F) | 0x00002000 |
| 32(20) | 0x00004800 |
| 33(21) | 0x00001000 |
| 34(22) | 0x00001000 |
| 35(23) | 0x00001000 |
| 36(24) | 0x00001000 |
| 37(25) | 0x00001000 |
| 38(26) | 0x00001000 |
| 39(27) | 0x00001000 |
| 40(28) | 0x00001000 |
| 41(29) | 0x00001000 |
| 42(2A) | 0x00001000 |
| 43(2B) | 0x00001000 |
| 44(2C) | 0x00001000 |
| 45(2D) | 0x00001000 |
| 46(2E) | 0x00001000 |
| 47(2F) | 0x00001000 |
| 48(30) | 0x00008400 |
| 49(31) | 0x00008401 |
| 50(32) | 0x00008402 |
| 51(33) | 0x00008403 |
| 52(34) | 0x00008404 |
| 53(35) | 0x00008405 |
| 54(36) | 0x00008406 |
| 55(37) | 0x00008407 |
| 56(38) | 0x00008408 |
| 57(39) | 0x00008409 |
| 58(3A) | 0x00001000 |
| 59(3B) | 0x00001000 |
| 60(3C) | 0x00001000 |
| 61(3D) | 0x00001000 |
| 62(3E) | 0x00001000 |
| 63(3F) | 0x00001000 |
| 64(40) | 0x00001000 |
| 65(41) | 0x0000810A |
| 66(42) | 0x0000810B |
| 67(43) | 0x0000810C |
| 68(44) | 0x0000810D |
| 69(45) | 0x0000810E |
| 70(46) | 0x0000810F |
| 71(47) | 0x00000110 |
| 72(48) | 0x00000111 |
| 73(49) | 0x00000112 |
| 74(4A) | 0x00000113 |
| 75(4B) | 0x00000114 |
| 76(4C) | 0x00000115 |
| 77(4D) | 0x00000116 |
| 78(4E) | 0x00000117 |
| 79(4F) | 0x00000118 |
| 80(50) | 0x00000119 |
| 81(51) | 0x0000011A |
| 82(52) | 0x0000011B |
| 83(53) | 0x0000011C |
| 84(54) | 0x0000011D |
| 85(55) | 0x0000011E |
| 86(56) | 0x0000011F |
| 87(57) | 0x00000120 |
| 88(58) | 0x00000121 |
| 89(59) | 0x00000122 |
| 90(5A) | 0x00000123 |
| 91(5B) | 0x00001000 |
| 92(5C) | 0x00001000 |
| 93(5D) | 0x00001000 |
| 94(5E) | 0x00001000 |
| 95(5F) | 0x00001100 |
| 96(60) | 0x00001000 |
| 97(61) | 0x0000820A |
| 98(62) | 0x0000820B |
| 99(63) | 0x0000820C |
| 100(64) | 0x0000820D |
| 101(65) | 0x0000820E |
| 102(66) | 0x0000820F |
| 103(67) | 0x00000210 |
| 104(68) | 0x00000211 |
| 105(69) | 0x00000212 |
| 106(6A) | 0x00000213 |
| 107(6B) | 0x00000214 |
| 108(6C) | 0x00000215 |
| 109(6D) | 0x00000216 |
| 110(6E) | 0x00000217 |
| 111(6F) | 0x00000218 |
| 112(70) | 0x00000219 |
| 113(71) | 0x0000021A |
| 114(72) | 0x0000021B |
| 115(73) | 0x0000021C |
| 116(74) | 0x0000021D |
| 117(75) | 0x0000021E |
| 118(76) | 0x0000021F |
| 119(77) | 0x00000220 |
| 120(78) | 0x00000221 |
| 121(79) | 0x00000222 |
| 122(7A) | 0x00000223 |
| 123(7B) | 0x00001000 |
| 124(7C) | 0x00001000 |
| 125(7D) | 0x00001000 |
| 126(7E) | 0x00001000 |
| 127(7F) | 0x00002000 |
剩下的方法
看吧,基本都是位運算:
有必要先解釋ch & 0xFFFFFF80:
這里做了幾個簡單的測試,測試結果反映了的情況是:0~127之間的數代入上面的表達式,結果為0。
具體的推導可以用二進制推一下,OK的。
好了,接下來看各個方法:
其對應的標注C函數也是進行判斷,若為英文字母,返回非0(小寫字母為2,大寫字母為1)。若不是字母,返回0。在標準c中相當于使用“ isupper( ch ) || islower( ch ) ”做測試。static boolean isAlpha(int ch) {return isType(ch, ALPHA); }
總結
ASCII類存在的意義簡而言之是進行某種轉換,將所謂的判斷轉換成實現標準C函數的功能。
它不是一個特別顯眼的類,但是值得研究。
知識水平有限,難免有疏漏之處。不足之處還望指出,謝謝!!!
總結
以上是生活随笔為你收集整理的【Java】ASCII类对ASCII码的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机科学基础】ASCII码表知识总结
- 下一篇: 【Java】异常处理的注意事项