ชุดอักขระ 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 | เครื่องหมายคำถาม |
@ | 64 | Ampersat, 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 | ตัวย่อ |
---|---|
00 | NUL ‘\0’ (อักขระว่าง) |
01 | SOH (จุดเริ่มต้นของหัวข้อ) |
02 | STX (จุดเริ่มต้นของข้อความ) |
03 | ETX (ส่วนท้ายของข้อความ) |
04 | EOT (สิ้นสุดการส่ง) |
05 | ENQ (สอบถาม) |
06 | ACK (รับทราบ) |
07 | เบล ‘\a’ (กระดิ่ง) |
08 | BS ‘\b’ (แบ็คสเปซ) |
14 | SO (เลื่อนออก) |
15 | SI (เลื่อนเข้า) |
16 | DLE (หนีดาต้าลิงค์) |
17 | DC1 (การควบคุมอุปกรณ์ 1) |
18 | DC2 (การควบคุมอุปกรณ์ 2) |
19 | DC3 (การควบคุมอุปกรณ์ 3) |
20 | DC4 (การควบคุมอุปกรณ์ 4) |
21 | NAK (แอกเชิงลบ) |
22 | SYN (ไม่ได้ใช้งานแบบซิงโครนัส) |
23 | ETB (สิ้นสุดทรานส์ blk) |
24 | สามารถ (ยกเลิก) |
25 | EM (ปลายสายกลาง) |
26 | ย่อย (แทน) |
27 | ESC (หนี) |
28 | FS (ตัวแยกไฟล์) |
29 | GS (ตัวแยกกลุ่ม) |
30 | RS (ตัวคั่นบันทึก) |
31 | สหรัฐอเมริกา (ตัวคั่นหน่วย) |
127 | DEL (ลบ) |
- Escape Sequences: อักขระเหล่านี้เป็นส่วนหนึ่งของชุดอักขระ Execution อักขระเหล่านี้ต้องมีแบ็กสแลช ( \ ) เพื่อระบุ ประกอบด้วยอักขระตั้งแต่ 2 ตัวขึ้นไป แต่ C PreProcessor จะถือว่าอักขระเหล่านี้เป็นอักขระตัวเดียว เช่น: \a , \b , \t เป็นต้น…
- White-space characters: อักขระเหล่านี้เป็นส่วนหนึ่งของชุดอักขระต้นทาง มีผลกับข้อความที่แสดง แต่จะว่างเปล่าทางสายตา
- Utility Functions: isspaceตรวจสอบว่าอักขระเป็นอักขระ white-space หรือไม่
อักขระ | ASCII | รายละเอียด |
---|---|---|
<space> | 32 | อวกาศ (SPC) |
\t | 9 | แท็บแนวนอน (TAB) |
\n | 10 | ขึ้นบรรทัดใหม่ (LF) |
\v | 11 | แท็บแนวตั้ง (VT) |
\f | 12 | ฟีด (FF) |
\r | 13 | carriage 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/