Series bài giảng lớp luyện thi FE chuẩn kỹ sư CNTT Nhật Bản. Tổ giảng viên biên soạn giáo trình chia sẻ miễn phí. Nếu bạn sử dụng hãy ghi rõ nguồn từ Techmaster Việt nam.

Cần nhớ 👆

  • String variable thường lưu ở stack
  • String literal lưu ở heap
  • String có nhiều phương thức để thao tác
  • Ích lợi bảng mã ASCII là chuẩn hoá, giúp nội dung string, text có thể đọc, hiểu bởi các loại máy tính hệ điều hành khác nhau
  • Ký tự được quy ước mã hoá dưới dạng số nguyên.
  • Bảng mã ASCII căn bản 0-127 ký tự bảng chữ cái và dấu phổ biến.
  • Bảng mã ASCII mở rộng 128-255 ký tự đặc biệt.

Khi phần mềm chạy, string literal được lưu ở vùng nhớ heap

String variable thường lưu vùng nhớ ngăn sếp (stack memory). Trong C++, biến con trỏ chuỗi sẽ lưu ở heap.
String literal lưu ở vùng nhớ heap. Java có vùng nhớ string constant pool để tái sử dụng chuỗi cho nhiều biến trỏ tới.
String Literal Memory

Bảng mã ASCII 7 bit và 8 bit

Một chuỗi gồm nhiều ký tự. Vậy một ký tự (character) được biểu diễn như thế nào?
Những năm 197x khi nước Mỹ có rất nhiều hãng máy tính chạy trên các hệ điều hành khác nhau, để cho dữ liệu string, text lưu trữ có thể đọc được bởi các máy tính, hệ điều hành khác nhau, uỷ ban tiêu chuẩn của Hoa Kỳ đưa bảng mã ASCII. Bảng mã ASCII (American Standard Code for Information Interchange) dùng để thống nhất mã quy đổi các các ký tự sang số nguyên (decimal code hoặc hex code). Như vậy ký tự sẽ lưu trữ dưới dạng byte.
Ví dụ ‘a’ = 97, ‘A’ = 65, ‘0’ = 48
Do bảng chữ cái Latin chỉ có 26 ký tự, thêm 26 ký tự Hoa, 10 chữ số, và một số ký tự đặc biệt (space, tab, <>, {}, ~`!@#$%^&*()_+=:;"<>,./?), nên chỉ cần số nguyên 7 bit (128 khả năng) là đủ biểu diễn.
Nếu dùng đủ 1 byte (8 bit - 256 khả năng), chúng ta có bảng ASCII căn bản và mở rộng. Bản mã ASCII mở rộng cho các ký tự đặc biệt.

Trích một phần bảng mã ASCII căn bản.

LetterASCII CodeBinaryLetterASCII CodeBinary
a09701100001A06501000001
b09801100010B06601000010
c09901100011C06701000011
d10001100100D06801000100
e10101100101E06901000101
f10201100110F07001000110
g10301100111G07101000111
h10401101000H07201001000
i10501101001I07301001001
j10601101010J07401001010
k10701101011K07501001011
l10801101100L07601001100
m10901101101M07701001101
n11001101110N07801001110
o11101101111O07901001111
p11201110000P08001010000
q11301110001Q08101010001
r11401110010R08201010010
s11501110011S08301010011
t11601110100T08401010100
u11701110101U08501010101
v11801110110V08601010110
w11901110111W08701010111
x12001111000X08801011000
y12101111001Y08901011001
z12201111010Z09001011010

Kiểu char trong ngôn ngữ lập trình

Kiểu char thể hiện 1 ký tự nó tương đương với kiểu nguyên dương 8 bit biểu diễn giá trị từ 0 đến 255. Đoạn code Java dưới sẽ in ra ký tự có mã từ 97 (a) đến 97 + 26 (z)

class Main {
  public static void main(String[] args) {
    for (char c = 97; c < 97 + 26; c++) {
      System.out.println(c);
    }
  }
}

Java Print ASCII

Những hệ mã hoá ký tự khác ASCII

ASCII chỉ đủ để mã hoá bảng ký tự Latin nhưng không đủ đã biểu diễn các bảng chữ cái các ngôn ngữ khác như: tiếng Hàn, Nhật, Trung Quốc, Việt nam… Bản mã Unicode sinh ra với vùng lưu trữ lớn hơn 2 bytes hoặc 4 bytes đủ để thể hiện tất cả các ký tự của bất kỳ ngôn ngữ nào. Nhược điểm của Unicode là tốn thêm dung lượng lưu trữ.

Tham khảo