Chuỗi ký tự (string): cách xử lý văn bản trong lập trình

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Tên người dùng, bình luận, email, tin nhắn: gần như mọi dữ liệu con người nhìn thấy đều là văn bản. Trong lập trình, văn bản được lưu dưới dạng chuỗi ký tự, và biết xử lý chuỗi là kỹ năng bạn dùng gần như mỗi ngày.

Chuỗi là gì?

Chuỗi (string) là một dãy các ký tự, đặt trong dấu nháy đơn hoặc nháy kép. Về bản chất, chuỗi giống một mảng các ký tự nên bạn có thể truy cập từng ký tự bằng chỉ số:

s = "Lập trình"
print(len(s))      # 9 (tính cả khoảng trắng)
print(s[0])        # L
print(s[-1])       # h
print(s[0:3])      # Lập

Ở nhiều ngôn ngữ như Python, Java, JavaScript, chuỗi là bất biến (immutable): bạn không sửa trực tiếp một ký tự, mà tạo ra chuỗi mới. Viết s[0] = "l" trong Python sẽ báo lỗi.

Các thao tác thông dụng

email = "  Nguyen@Example.com  "
sach = email.strip().lower()
print(sach)                       # nguyen@example.com
print(sach.replace("@", " at "))  # nguyen at example.com
print("example" in sach)          # True
print(sach.split("@"))            # ['nguyen', 'example.com']
print(", ".join(["a", "b", "c"])) # a, b, c
  • strip() cắt khoảng trắng hai đầu.
  • lower(), upper() đổi chữ thường, chữ hoa.
  • split() tách chuỗi thành danh sách, join() làm ngược lại.
  • replace() thay thế, find() tìm vị trí.
  • startswith(), endswith() kiểm tra đầu và cuối chuỗi.

Nối chuỗi và định dạng

Có thể nối bằng dấu +, nhưng cách gọn và dễ đọc hơn là chuỗi định dạng (f-string trong Python):

ten = "Lan"
diem = 8.5
print("Chào " + ten + ", điểm " + str(diem))
print(f"Chào {ten}, điểm {diem}")
print(f"Điểm làm tròn: {diem:.0f}")

JavaScript có chuỗi mẫu tương tự bằng dấu huyền: `Chào ${ten}`. Nối chuỗi trong vòng lặp rất lớn nên dùng danh sách rồi join để tránh tạo quá nhiều chuỗi trung gian.

Ký tự đặc biệt và escape

Một số ký tự cần viết kèm dấu gạch chéo ngược: \n xuống dòng, \t tab, \" dấu nháy kép bên trong chuỗi nháy kép. Ví dụ:

print("Dòng 1\nDòng 2")
print("Anh ấy nói: \"Chào bạn\"")

Chuỗi và tiếng Việt: Unicode

Máy tính lưu chữ bằng số. Ngày xưa mỗi quốc gia một bảng mã, nay chuẩn Unicode (thường lưu dưới dạng UTF-8) hỗ trợ hầu hết chữ viết trên thế giới, trong đó có tiếng Việt đầy đủ dấu. Điều này kéo theo vài lưu ý:

  • Luôn lưu file và cơ sở dữ liệu bằng UTF-8 để không bị lỗi font.
  • Một ký tự có dấu có thể gồm nhiều byte, nên độ dài tính bằng byte khác độ dài tính bằng ký tự.
  • Chữ như "ế" có thể được lưu ở dạng một ký tự dựng sẵn hoặc chữ cái cộng dấu rời; khi so sánh hay tìm kiếm có thể cần chuẩn hóa chuỗi.

Bài toán kinh điển với chuỗi

def la_doi_xung(s):
    s = s.lower().replace(" ", "")
    return s == s[::-1]

print(la_doi_xung("Madam"))        # True
print(la_doi_xung("Xin chào"))     # False

def dem_tu(cau):
    return len(cau.split())

print(dem_tu("học lập trình thật vui"))   # 5

Hàm đầu kiểm tra chuỗi đối xứng (palindrome), hàm sau đếm số từ. Các bài như đảo từ trong câu, đếm nguyên âm, đếm tần suất ký tự đều là bài tập tốt.

Lỗi thường gặp

  1. Cộng chuỗi với số mà không đổi kiểu.
  2. Quên chuỗi bất biến nên gọi s.upper() mà không gán kết quả lại.
  3. So sánh chuỗi không phân biệt hoa thường mà quên chuẩn hóa.
  4. Ghép chuỗi để tạo câu truy vấn SQL từ dữ liệu người dùng, rất dễ gây lỗ hổng bảo mật; hãy dùng truy vấn tham số hóa.

Ví dụ: tạo slug từ tiêu đề

Các trang web thường biến tiêu đề thành đường dẫn thân thiện. Đây là bài tập xử lý chuỗi thực tế:

import re
import unicodedata

def tao_slug(tieu_de):
    s = unicodedata.normalize("NFD", tieu_de.lower())
    s = "".join(c for c in s if unicodedata.category(c) != "Mn")
    s = s.replace("đ", "d")
    s = re.sub(r"[^a-z0-9]+", "-", s)
    return s.strip("-")

print(tao_slug("Lập trình là gì?"))   # lap-trinh-la-gi

Hàm chuẩn hóa chuỗi về dạng tách dấu, loại bỏ các dấu thanh, đổi chữ "đ", rồi thay mọi ký tự không phải chữ hoặc số bằng dấu gạch ngang. Ví dụ cho thấy chuỗi tiếng Việt cần xử lý Unicode cẩn thận chứ không chỉ thay thế đơn giản. Hãy thử với vài tiêu đề của riêng bạn và xem ký tự nào còn sót lại.

Kết luận

Chuỗi tưởng đơn giản nhưng ẩn nhiều chi tiết: bất biến, Unicode, định dạng. Thành thạo vài hàm cốt lõi như strip, split, join, replace, bạn đã xử lý được phần lớn công việc văn bản hằng ngày. Hãy thử viết một chương trình đếm tần suất từ trong một đoạn văn để luyện tay.

Học xong lý thuyết, hãy thực hành thật nhiều; các bài giảng có bài tập trong khóa học codebem.com sẽ giúp bạn việc đó.

author_photo
Nguyễn Đình Cường

0 comment