הטיפוס char


הסבר על משתנים מסוג תו / char

משתנה מסוג 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);
}