ชุดอักขระ C (C Character Set)

ภาพรวม


ชุดอักขระประกอบด้วยชุดอักขระที่ถูกต้องที่เราสามารถใช้ในโปรแกรมของเราในสภาพแวดล้อมที่แตกต่างกัน ภาษาซีมีชุดอักขระอย่างกว้างๆ สองชุด

  • ชุดอักขระต้นทาง (SCS): SCS ใช้เพื่อแยกวิเคราะห์ซอร์สโค้ดเป็นการแสดงภายในก่อนขั้นตอนก่อนการประมวลผล ชุดนี้ประกอบด้วยชุดอักขระพื้นฐานและอักขระช่องว่าง
  • Execution Character Set (ECS): ECS ใช้เพื่อเก็บค่าคงที่สตริงอักขระ นอกเหนือจากชุดอักขระพื้นฐาน ชุดนี้มีอักขระควบคุมและ Escape Sequences


ขอบเขตของบทความ


  • บทความนี้กล่าวถึงประวัติการเข้ารหัสอักขระ ในที่นี้ เราพูดถึงการเข้ารหัสรูปแบบเก่าที่เรียกว่า EBCDIC, ASCII และ Unicode มาตรฐานปัจจุบัน
  • นอกจากนี้ จะมีการอธิบายชุดอักขระประเภทต่างๆ ใน C ด้วยการใช้ฟังก์ชันยูทิลิตี้ที่มีอยู่ใน C


เบื้องหลัง


อักขระคือข้อมูลขนาด 1 ไบต์ที่แสดงถึงตัวอักษร ตัวเลข และอักขระพิเศษบางตัว เช่น ! , @ ฯลฯ ดูเหมือนง่าย แต่มีประวัติอันยาวนานของมาตรฐานที่แตกต่างกันเช่น EBCDIC , ASCII ฯลฯ

ในช่วงแรกๆ เคยมีระบบการเข้ารหัสที่เรียกว่า Extended Binary-Coded Decimal Interchange Code ( EBCDIC ) ซึ่งพัฒนาโดย IBM EBCDIC รองรับอักขระได้ 256 ชนิด คุณสมบัติที่สำคัญบางประการของ EBCDIC คือ:

  • อักขระแต่ละตัวพอดีใน 8 บิต
  • อักขระประเภทเดียวกันจะไม่ถูกจัดกลุ่มเข้าด้วยกัน
  • EBCDIC เวอร์ชันต่างๆ เข้ากันไม่ได้


การเข้ารหัส ASCII อย่างช้าๆ ได้รับการพัฒนาในปี 1963 โดย American Standards Association (ASA) ASCII นั้นง่ายกว่าและรองรับอักขระน้อยกว่า EBCDIC มี 128 อักขระและต้องใช้ 7 บิตเพื่อแสดงอักขระตัวเดียว


ความขัดแย้งอื่น


คอมพิวเตอร์ส่วนใหญ่ใช้ 8-bit ไบต์และ ASCII ต้องการเพียง 7 บิต (เช่น 2 7 = 128 อักขระ) เรามีบิตสำรองไว้อีกหนึ่งบิต ในไม่ช้า มีเพียงไม่กี่องค์กรที่พัฒนาแบบแผนของตนเองสำหรับอักขระ [128, 255] ตัว IBM ได้พัฒนาชุดอักขระ OEM ซึ่งรวมถึงอักขระพิเศษ เช่น | , Ã , Æ เป็นต้น IBM เปลี่ยนชุดอักขระเหล่านี้ เช่น [128, 255] ตามแต่ละประเทศ ตัวอย่างเช่น รหัสอักขระ 130 แสดง é ในยุโรป และแสดง ℷ ในอิสราเอล หากสิ่งนี้ปรากฏเป็นปัญหาเล็ก ๆ ให้รอจนกว่าภาษาเอเชียจะเข้ามาในรูปภาพด้วยตัวอักษรนับพัน! ในช่วงเวลาที่ยากลำบากเหล่านี้ มาตรฐานกำลังค่อยๆ เข้ามา…


Unicode Era


ต่างจากการแปลงรหัสอักขระเป็นไบนารีโดยตรง Unicode มีมุมมองที่แตกต่างกันเกี่ยวกับอักขระ ซึ่งช่วยให้ Unicode รองรับอักขระได้ไม่จำกัดจำนวน ( ในการเข้ารหัสประเภทต่างๆ ) บทความนี้ไม่ได้กล่าวถึงการใช้งาน Unicode แต่ประเด็นสำคัญที่ควรทราบมีดังนี้

  • Unicode เป็นเพียงมาตรฐาน UTF-8, UTF-16 ฯลฯ… คือการเข้ารหัสที่แท้จริง
  • ตำนานยอดนิยม: UTF-8 ต้องใช้ 2 ไบต์ (16 บิต) เพื่อจัดเก็บอักขระ ดังนั้นจึงสามารถแสดง อักขระได้สูงสุด 2 16 (65,536) นี้เป็นเท็จ อักขระบางตัวถูกเก็บไว้ใน 1 ไบต์ บางส่วนถูกเก็บไว้ใน 2 ไบต์ บางคนถึงกับต้องการ 6 ไบต์!
  • การแสดงอักขระนั้นไม่ง่ายเหมือนการแปลงเป็นไบนารี
  • UTF-8 เป็นซูเปอร์เซ็ตของ ASCII กล่าวคือ อักขระที่มีรหัส ASCII [0, 127] สามารถแสดงด้วยรหัสอักขระเดียวกันได้


บทนำของชุดอักขระ C


หลักๆ จะมีชุดอักขระในภาษา C อยู่ 2 ชุด

  • Source Character Set: นี่คือชุดของอักขระที่สามารถใช้เขียนซอร์สโค้ดได้ ก่อนขั้นตอนก่อนการประมวลผล ขั้นตอนแรกของ C PreProcessor (CPP) คือการแปลงการเข้ารหัสของซอร์สโค้ดเป็น Source Character Set (SCS) เช่นA , Tab, B , SPACE , \n เป็นต้น
  • Execution Character Set: นี่คือชุดของอักขระที่สามารถตีความได้โดยโปรแกรมที่ทำงานอยู่ หลังจากขั้นตอนก่อนการประมวลผล CPP จะแปลงการเข้ารหัสอักขระและค่าคงที่สตริงเป็น Execution Character Set (ECS) เช่น A , B , \a เป็นต้น

โดยค่าเริ่มต้น CPP จะใช้การเข้ารหัส UTF-8 สำหรับทั้งชุดอักขระต้นทางและการดำเนินการ ผู้ใช้สามารถเปลี่ยนแปลงได้ด้วยแฟล็กคอมไพเลอร์ด้านล่าง

-finput-charsetใช้เพื่อตั้งค่า SCS
การใช้งาน: gcc main.c -finput-charset=UTF-8
-fexec-charsetใช้เพื่อตั้งค่า ECS
การใช้งาน: gcc main.c -fexec-charset=UTF-8

หมายเหตุ : ชุดอักขระพื้นฐานเป็นเรื่องปกติระหว่าง SCS และ ECS


ชุดอักขระพื้นฐาน


ชุดอักขระที่มาและการดำเนินการมีอักขระทั่วไปไม่กี่ตัว ชุดอักขระทั่วไปเรียกว่า ชุดอักขระพื้นฐาน มาพูดคุยกันเพิ่มเติมเกี่ยวกับเรื่องนี้ด้านล่าง:

ตัวอักษร:ซึ่งมีทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก รหัส ASCII ของตัวพิมพ์ใหญ่อยู่ในช่วง [65, 90] ในขณะที่รหัส ASCII ของตัวพิมพ์เล็กอยู่ในช่วง [97, 122] เช่น A , B , a , bเป็นต้น

อักขระตัวพิมพ์ใหญ่และตัวพิมพ์เล็กต่างกันเพียงบิตเดียว

ฟังก์ชั่นยูทิลิตี้: isalpha , islower , isupperตรวจสอบว่าตัวอักษรเป็นตัวอักษร, ตัวพิมพ์เล็ก, ตัวพิมพ์ใหญ่ตามลำดับ tolower , toupperแปลงตัวอักษรเป็นตัวพิมพ์ที่เหมาะสม

ตัวเลข:รวมตัวเลขตั้งแต่ 0 ถึง 9 ( รวม ) รหัส ASCII ของตัวเลขอยู่ในช่วง [48, 57] เช่น 0 , 1 , 2เป็นต้น

  • ฟังก์ชันยูทิลิตี้: isdigitตรวจสอบว่าอักขระที่ป้อนเป็นตัวเลขหรือไม่ isalnumตรวจสอบว่าอักขระเป็นตัวอักษรและตัวเลขหรือไม่

เครื่องหมายวรรคตอน/อักขระพิเศษ:ตำแหน่งที่ตั้ง C เริ่มต้นจัดประเภทอักขระด้านล่างเป็นอักขระเครื่องหมายวรรคตอน

  • ฟังก์ชันยูทิลิตี้: ispunctตรวจสอบว่าอักขระเป็นอักขระเครื่องหมายวรรคตอนหรือไม่ ตารางด้านล่างประกอบด้วยรายการของเครื่องหมายวรรคตอน รหัส ASCII และกรณีการใช้งานทั้งหมด


อักขระASCIIรายละเอียด
!33เครื่องหมายตกใจ อัศเจรีย์ หรือปัง
34ใบเสนอราคา เครื่องหมายอัญประกาศ หรือเครื่องหมายจุลภาคกลับด้าน
#35อ็อกโทธอร์ป ตัวเลข ปอนด์ ชาร์ป หรือแฮช
$36เครื่องหมายดอลลาร์หรือสกุลเงินทั่วไป
%37เปอร์เซ็นต์
&38แอมเพอร์แซนด์ อีเพอร์แชนด์ หรือ และสัญลักษณ์
39อะพอสทรอฟีหรืออัญประกาศเดี่ยว
(40วงเล็บเปิดหรือวงเล็บซ้าย
)41วงเล็บปิดหรือวงเล็บขวา
*42เครื่องหมายดอกจัน สัญลักษณ์การคูณทางคณิตศาสตร์ และบางครั้งเรียกว่าดาว
+43พลัส.
,44จุลภาค
45ยัติภังค์ ลบ หรือขีดกลาง
.46จุดหรือจุดหยุดเต็ม
/47ฟอร์เวิร์ดสแลช, solidus, virgule, whack และสัญลักษณ์การหารทางคณิตศาสตร์
:58โคลอน
;59อัฒภาค.
<60น้อยกว่าหรือวงเล็บเหลี่ยม
=61เท่ากัน.
>62วงเล็บมากกว่าหรือมุม
?63เครื่องหมายคำถาม
@64Ampersat, arobase, asperand, at หรือ at symbol.
[91เปิดวงเล็บ.
\92แบ็กสแลชหรือโซลิดัสย้อนกลับ
]93วงเล็บปิด
^94คาเร็ตหรือเซอร์คัมเฟล็กซ์
_95ขีดเส้นใต้
96เฉียบพลัน, แบคโควต, แบคทิก, หลุมฝังศพ, สำเนียงหลุมฝังศพ, อัญประกาศด้านซ้าย, อัญประกาศเปิด, หรือการกด
{123วงเล็บปีกกา วงเล็บปีกกา หรือวงเล็บปีกกา
}125ปิดวงเล็บปีกกา วงเล็บปีกกา หรือวงเล็บปีกกา
~126ตัวหนอน

ชุดอักขระควบคุม


อักขระเหล่านี้มีตั้งแต่รหัส ASCII 0 ถึง 31 ( รวม ) และอักขระที่ 127 พวกเขามองไม่เห็น แต่จะส่งผลต่อโปรแกรมในรูปแบบต่างๆ ตัวอย่างเช่น: อักขระ \a (BEL) อาจทำให้เกิดเสียงบี๊บหรือหน้าจอกะพริบเมื่อพิมพ์ อักขระ \b (BS) จะเลื่อนเคอร์เซอร์ถอยหลังหนึ่งก้าว (ไม่เหมือนBackspaceบนแป้นพิมพ์ ซึ่งจะลบอักขระก่อนหน้า)

  • Utility Functions:  iscntrl ตรวจสอบว่าอักขระเป็นอักขระควบคุมหรือไม่

ASCIIตัวย่อ
00NUL ‘\0’ (อักขระว่าง)
01SOH (จุดเริ่มต้นของหัวข้อ)
02STX (จุดเริ่มต้นของข้อความ)
03ETX (ส่วนท้ายของข้อความ)
04EOT (สิ้นสุดการส่ง)
05ENQ (สอบถาม)
06ACK (รับทราบ)
07เบล ‘\a’ (กระดิ่ง)
08BS ‘\b’ (แบ็คสเปซ)
14SO (เลื่อนออก)
15SI (เลื่อนเข้า)
16DLE (หนีดาต้าลิงค์)
17DC1 (การควบคุมอุปกรณ์ 1)
18DC2 (การควบคุมอุปกรณ์ 2)
19DC3 (การควบคุมอุปกรณ์ 3)
20DC4 (การควบคุมอุปกรณ์ 4)
21NAK (แอกเชิงลบ)
22SYN (ไม่ได้ใช้งานแบบซิงโครนัส)
23ETB (สิ้นสุดทรานส์ blk)
24สามารถ (ยกเลิก)
25EM (ปลายสายกลาง)
26ย่อย (แทน)
27ESC (หนี)
28FS (ตัวแยกไฟล์)
29GS (ตัวแยกกลุ่ม)
30RS (ตัวคั่นบันทึก)
31สหรัฐอเมริกา (ตัวคั่นหน่วย)
127DEL (ลบ)

  • Escape Sequences: อักขระเหล่านี้เป็นส่วนหนึ่งของชุดอักขระ Execution อักขระเหล่านี้ต้องมีแบ็กสแลช ( \ ) เพื่อระบุ ประกอบด้วยอักขระตั้งแต่ 2 ตัวขึ้นไป แต่ C PreProcessor จะถือว่าอักขระเหล่านี้เป็นอักขระตัวเดียว เช่น: \a , \b , \t เป็นต้น…
  • White-space characters: อักขระเหล่านี้เป็นส่วนหนึ่งของชุดอักขระต้นทาง มีผลกับข้อความที่แสดง แต่จะว่างเปล่าทางสายตา
  • Utility Functions: isspaceตรวจสอบว่าอักขระเป็นอักขระ white-space หรือไม่

อักขระASCIIรายละเอียด
<space>32อวกาศ (SPC)
\t9แท็บแนวนอน (TAB)
\n10ขึ้นบรรทัดใหม่ (LF)
\v11แท็บแนวตั้ง (VT)
\f12ฟีด (FF)
\r13carriage return (CR)

พิมพ์ตัวอักษรทั้งหมด

#include <stdio.h>
#include <ctype.h>

int main() {
   printf("| Character | ASCII | Type        |\n");
   printf("| :-------: | ----: | :---------- |\n");
   for (int i = 32; i < 127; i++) {
       printf("|  %3c      | %3d   | ", i, i);
       if (isalpha(i))
           printf("Alphabet    |\n");
       else if (isdigit(i))
           printf("Digit       |\n");
       else if (ispunct(i))
           printf("Punctuation |\n");
       else if (isspace(i))
           printf("Space       |\n");
       else if (iscntrl(i))
           printf("Control     |\n");
   }
   return 0;
}

Output

| Character | ASCII | Type        |
| :-------: | ----: | :---------- |
|           |  32   | Space       |
|    !      |  33   | Punctuation |
|    "      |  34   | Punctuation |
|    #      |  35   | Punctuation |
|    $      |  36   | Punctuation |
|    %      |  37   | Punctuation |
|    &      |  38   | Punctuation |
|    '      |  39   | Punctuation |
|    (      |  40   | Punctuation |
|    )      |  41   | Punctuation |
|    *      |  42   | Punctuation |
|    +      |  43   | Punctuation |
|    ,      |  44   | Punctuation |
|    -      |  45   | Punctuation |
|    .      |  46   | Punctuation |
|    /      |  47   | Punctuation |
|    0      |  48   | Digit       |
|    1      |  49   | Digit       |
|    2      |  50   | Digit       |
|    3      |  51   | Digit       |
|    4      |  52   | Digit       |
|    5      |  53   | Digit       |
|    6      |  54   | Digit       |
|    7      |  55   | Digit       |
|    8      |  56   | Digit       |
|    9      |  57   | Digit       |
|    :      |  58   | Punctuation |
|    ;      |  59   | Punctuation |
|    <      |  60   | Punctuation |
|    =      |  61   | Punctuation |
|    >      |  62   | Punctuation |
|    ?      |  63   | Punctuation |
|    @      |  64   | Punctuation |
|    A      |  65   | Alphabet    |
|    B      |  66   | Alphabet    |
|    C      |  67   | Alphabet    |
|    D      |  68   | Alphabet    |
|    E      |  69   | Alphabet    |
|    F      |  70   | Alphabet    |
|    G      |  71   | Alphabet    |
|    H      |  72   | Alphabet    |
|    I      |  73   | Alphabet    |
|    J      |  74   | Alphabet    |
|    K      |  75   | Alphabet    |
|    L      |  76   | Alphabet    |
|    M      |  77   | Alphabet    |
|    N      |  78   | Alphabet    |
|    O      |  79   | Alphabet    |
|    P      |  80   | Alphabet    |
|    Q      |  81   | Alphabet    |
|    R      |  82   | Alphabet    |
|    S      |  83   | Alphabet    |
|    T      |  84   | Alphabet    |
|    U      |  85   | Alphabet    |
|    V      |  86   | Alphabet    |
|    W      |  87   | Alphabet    |
|    X      |  88   | Alphabet    |
|    Y      |  89   | Alphabet    |
|    Z      |  90   | Alphabet    |
|    [      |  91   | Punctuation |
|    \      |  92   | Punctuation |
|    ]      |  93   | Punctuation |
|    ^      |  94   | Punctuation |
|    _      |  95   | Punctuation |
|    `      |  96   | Punctuation |
|    a      |  97   | Alphabet    |
|    b      |  98   | Alphabet    |
|    c      |  99   | Alphabet    |
|    d      | 100   | Alphabet    |
|    e      | 101   | Alphabet    |
|    f      | 102   | Alphabet    |
|    g      | 103   | Alphabet    |
|    h      | 104   | Alphabet    |
|    i      | 105   | Alphabet    |
|    j      | 106   | Alphabet    |
|    k      | 107   | Alphabet    |
|    l      | 108   | Alphabet    |
|    m      | 109   | Alphabet    |
|    n      | 110   | Alphabet    |
|    o      | 111   | Alphabet    |
|    p      | 112   | Alphabet    |
|    q      | 113   | Alphabet    |
|    r      | 114   | Alphabet    |
|    s      | 115   | Alphabet    |
|    t      | 116   | Alphabet    |
|    u      | 117   | Alphabet    |
|    v      | 118   | Alphabet    |
|    w      | 119   | Alphabet    |
|    x      | 120   | Alphabet    |
|    y      | 121   | Alphabet    |
|    z      | 122   | Alphabet    |
|    {      | 123   | Punctuation |
|    |      | 124   | Punctuation |
|    }      | 125   | Punctuation |
|    ~      | 126   | Punctuation |

  • ctype.h มีฟังก์ชันยูทิลิตี้ isalpha , isdigit ดังนั้นเราจึงรวมไว้ที่ด้านบน
  • เนื่องจากอักขระควบคุมไม่ปรากฏให้เห็น เราจึงไม่พิมพ์อักขระดังกล่าว กล่าวคือ เราเริ่มการวนซ้ำที่รหัส ASCII 32
  • ด้วยความช่วยเหลือของฟังก์ชั่นยูทิลิตี้ เรากำลังค้นหาประเภทของตัวละคร
  • ผลลัพธ์ของโปรแกรมนี้คือตาราง markdown ของอักขระที่จัดรูปแบบ

สรุป

  • ภาษา C มีชุดอักขระสองประเภทคือ: ชุดอักขระต้นทาง (SCS) ชุดอักขระการดำเนินการ (ECS)
  • C ซอร์สโค้ดถูกแปลงเป็น SCS โดย CPP ก่อนการประมวลผลล่วงหน้า CPP แปลงค่าคงที่อักขระและสตริงเป็น ECS หลังจากประมวลผลล่วงหน้า
  • อักขระช่องว่างจะว่างเปล่าทางสายตา แต่จะส่งผลต่อข้อความ อักขระควบคุมไม่ปรากฏให้เห็น แต่มีการทำงานที่แตกต่างกัน เช่น ทำให้เกิดเสียงกระดิ่ง ( \a ) การเลื่อนเคอร์เซอร์ไปทางซ้าย ( \b ) เป็นต้น
  • ctype.h มีฟังก์ชันยูทิลิตี้มากมายสำหรับทำงานกับอักขระเช่นisalpha , isdigitเป็นต้น


credit : https://www.scaler.com/topics/c/

Leave a Reply

Your email address will not be published. Required fields are marked *