משתנה מסוג char
בשפת C# מיועד לאחסן תו בודד (אות, ספרה, סימן מיוחד וכדומה). בפועל, תווים אלו מיוצגים בצורה מספרית, לפי תקן ASCII (American Standard Code for Information Interchange).
תו עוטפים בגרש בודד ‘ במקום בגרשיים “ ;'char ch = 'b
דוגמת קוד להמרות בין char ו-int
הקוד הבא מדגים כיצד משתנה מסוג char ניתן להמרה למספר שלם (int
) ולהפך:
1
2
3
4
5
6
7
8
9
10
11
static void Main(String[] args)
{
int num;
char ch;
ch = 'c'; // ch למשתנה 'c' השמה של התו
num = ch; // num לתוך המשתנה ASCII המרה אוטומטית. קבלת קוד
Console.WriteLine("num == " + num); // 99 :'c' יוצג הערך המספרי של
Console.WriteLine("ch == " + ch); // 'c' יציג את התו
ch = (char)(num + 1); // 'c' יקבל את התו הבא אחרי ch המרה מפורשת: המשתנה
Console.WriteLine("ch == " + ch); // 'd' יציג את התו
}
מידע נוסף על תווים (ASCII)
ASCII הוא תקן אמריקאי לייצוג מידע באמצעות ספרות, המאפשר הצגה של אותיות, מספרים וסימנים שונים בקוד בינארי. כל תו מיוצג באמצעות מספר בין 0 ל-127 לדוגמה: בקוד ASCII, התו ‘A’ מתאים למספר 65, התו ‘B’ מתאים ל-66, התו ‘a’ ל-97 והתו ‘b’ ל-98.
כאשר ממירים בין משתנים מטיפוס char למשתנים מטיפוס int, המשתנה מטיפוס char יומר לערך המספרי של קוד ה-ASCII של התו שהוא מאחסן. בכיוון ההפוך, כאשר ממירים משתנה מטיפוס int למשתנה מטיפוס char, מתקבל התו המתאים לערך המספרי של קוד ה-ASCII.
לדוגמה, ההמרה הבאה:
ch = (char)num;
תציב במשתנה מסוג char את התו שקוד ה-ASCII שלו שווה לערך המספרי המאוחסן ב-num.
טיפוס char בשפת C# הוא 16bit, בניגוד לשפות אחרות בהן תו (char) הוא בגודל של 8 ביט בלבד. הסיבה לכך היא שתווי C# מאוחסנים בתקן UTF-16, המאפשר תמיכה במגוון רחב של תווים בינלאומיים מעבר לתווי האלפבית האנגלי הפשוט, כגון תווים בעברית (א, ב…), ערבית, סינית, רוסית, וסימנים מיוחדים נוספים (כגון סימני מטבע: ₪, €, £ וכדומה). עם זאת, תווים שנמצאים מעל הטווח הבסיסי (מעל U+FFFF), כמו אימוג’ים למשל 😀, דורשים יותר מ-16 ביט ולכן מיוצגים ב-UTF-16 כזוג תווים (Surrogate Pair). כתוצאה מכך, לא ניתן להכניס אותם לתוך משתנה יחיד מסוג char, אלא רק במחרוזת (string) שמורכבת מרצף של תווים:
// לא חוקי - '😀' מיוצג בזוג תווים
// char emoji = '😀';
// חוקי - מחרוזת יכולה להכיל זוגות UTF-16
string emoji = "😀";
תרגול - הריצו את שתי גרסאות הקוד הבאות
1
2
3
4
5
6
7
8
9
static void Main(String[] args)
{
int num;
char ch;
ch = 'c'; // c has ascii value 99
num = ch; // implicit type conversion from char to int
Console.WriteLine("num=" + num);
Console.WriteLine("ch=" + ch);
}
בגרסה הבאה יש שגיאה. העתיקו את הקוד, הריצו אותו, וזהו מה השגיאה (בעזרת הודעות השגיאה של VS):
1
2
3
4
5
6
7
8
9
static void Main(String[] args)
{
int num;
char ch;
num = 99;
ch = num;
Console.WriteLine("num=" + num);
Console.WriteLine("ch=" + ch);
}
טבלת ASCII
Dec | Hex | Char | Description | Dec | Hex | Char | Description |
---|---|---|---|---|---|---|---|
0 | 0x00 | NUL | Null | 64 | 0x40 | @ | At sign |
1 | 0x01 | SOH | Start of Header | 65 | 0x41 | A | Uppercase A |
2 | 0x02 | STX | Start of Text | 66 | 0x42 | B | Uppercase B |
3 | 0x03 | ETX | End of Text | 67 | 0x43 | C | Uppercase C |
4 | 0x04 | EOT | End of Transmiss. | 68 | 0x44 | D | Uppercase D |
5 | 0x05 | ENQ | Enquiry | 69 | 0x45 | E | Uppercase E |
6 | 0x06 | ACK | Acknowledge | 70 | 0x46 | F | Uppercase F |
7 | 0x07 | BEL | Bell | 71 | 0x47 | G | Uppercase G |
8 | 0x08 | BS | Backspace | 72 | 0x48 | H | Uppercase H |
9 | 0x09 | TAB | Horizontal Tab | 73 | 0x49 | I | Uppercase I |
10 | 0x0A | LF | Line Feed | 74 | 0x4A | J | Uppercase J |
11 | 0x0B | VT | Vertical Tab | 75 | 0x4B | K | Uppercase K |
12 | 0x0C | FF | Form Feed | 76 | 0x4C | L | Uppercase L |
13 | 0x0D | CR | Carriage Return | 77 | 0x4D | M | Uppercase M |
14 | 0x0E | SO | Shift Out | 78 | 0x4E | N | Uppercase N |
15 | 0x0F | SI | Shift In | 79 | 0x4F | O | Uppercase O |
16 | 0x10 | DLE | Data Link Escape | 80 | 0x50 | P | Uppercase P |
17 | 0x11 | DC1 | Device Control 1 | 81 | 0x51 | Q | Uppercase Q |
18 | 0x12 | DC2 | Device Control 2 | 82 | 0x52 | R | Uppercase R |
19 | 0x13 | DC3 | Device Control 3 | 83 | 0x53 | S | Uppercase S |
20 | 0x14 | DC4 | Device Control 4 | 84 | 0x54 | T | Uppercase T |
21 | 0x15 | NAK | Negative Ack | 85 | 0x55 | U | Uppercase U |
22 | 0x16 | SYN | Synchronous Idle | 86 | 0x56 | V | Uppercase V |
23 | 0x17 | ETB | End of Block | 87 | 0x57 | W | Uppercase W |
24 | 0x18 | CAN | Cancel | 88 | 0x58 | X | Uppercase X |
25 | 0x19 | EM | End of Medium | 89 | 0x59 | Y | Uppercase Y |
26 | 0x1A | SUB | Substitute | 90 | 0x5A | Z | Uppercase Z |
27 | 0x1B | ESC | Escape | 91 | 0x5B | [ | Left Bracket |
28 | 0x1C | FS | File Separator | 92 | 0x5C | \ | Backslash |
29 | 0x1D | GS | Group Separator | 93 | 0x5D | ] | Right Bracket |
30 | 0x1E | RS | Record Separator | 94 | 0x5E | ^ | Caret |
31 | 0x1F | US | Unit Separator | 95 | 0x5F | _ | Underscore |
32 | 0x20 | (sp) | Space | 96 | 0x60 | ` | Grave Accent |
33 | 0x21 | ! | Exclamation Mark | 97 | 0x61 | a | Lowercase a |
34 | 0x22 | ” | Double Quote | 98 | 0x62 | b | Lowercase b |
35 | 0x23 | # | Number Sign | 99 | 0x63 | c | Lowercase c |
36 | 0x24 | $ | Dollar Sign | 100 | 0x64 | d | Lowercase d |
37 | 0x25 | % | Percent Sign | 101 | 0x65 | e | Lowercase e |
38 | 0x26 | & | Ampersand | 102 | 0x66 | f | Lowercase f |
39 | 0x27 | ’ | Apostrophe | 103 | 0x67 | g | Lowercase g |
40 | 0x28 | ( | Left Parenthesis | 104 | 0x68 | h | Lowercase h |
41 | 0x29 | ) | Right Parenthesis | 105 | 0x69 | i | Lowercase i |
42 | 0x2A | * | Asterisk | 106 | 0x6A | j | Lowercase j |
43 | 0x2B | + | Plus Sign | 107 | 0x6B | k | Lowercase k |
44 | 0x2C | , | Comma | 108 | 0x6C | l | Lowercase l |
45 | 0x2D | - | Hyphen | 109 | 0x6D | m | Lowercase m |
46 | 0x2E | . | Period | 110 | 0x6E | n | Lowercase n |
47 | 0x2F | / | Slash | 111 | 0x6F | o | Lowercase o |
48 | 0x30 | 0 | Digit Zero | 112 | 0x70 | p | Lowercase p |
49 | 0x31 | 1 | Digit One | 113 | 0x71 | q | Lowercase q |
50 | 0x32 | 2 | Digit Two | 114 | 0x72 | r | Lowercase r |
51 | 0x33 | 3 | Digit Three | 115 | 0x73 | s | Lowercase s |
52 | 0x34 | 4 | Digit Four | 116 | 0x74 | t | Lowercase t |
53 | 0x35 | 5 | Digit Five | 117 | 0x75 | u | Lowercase u |
54 | 0x36 | 6 | Digit Six | 118 | 0x76 | v | Lowercase v |
55 | 0x37 | 7 | Digit Seven | 119 | 0x77 | w | Lowercase w |
56 | 0x38 | 8 | Digit Eight | 120 | 0x78 | x | Lowercase x |
57 | 0x39 | 9 | Digit Nine | 121 | 0x79 | y | Lowercase y |
58 | 0x3A | : | Colon | 122 | 0x7A | z | Lowercase z |
59 | 0x3B | ; | Semicolon | 123 | 0x7B | { | Left Brace |
60 | 0x3C | < | Less Than | 124 | 0x7C | | | Vertical Bar |
61 | 0x3D | = | Equal Sign | 125 | 0x7D | } | Right Brace |
62 | 0x3E | > | Greater Than | 126 | 0x7E | ~ | Tilde |
63 | 0x3F | ? | Question Mark | 127 | 0x7F | DEL | Delete |