1. Ký tự đặc biệt cơ bản và escape
Trong lập trình, string không chỉ có chữ cái mà còn có ký tự đặc biệt: dấu ngoặc kép, xuống dòng, tab, đôi khi còn có mấy thứ như \n và \t. Nhưng nếu bạn muốn viết trong string Chào, "user"!, compiler sẽ hỏi ngay: “Ủa, ngoặc kép trong string là lỗi hả?”. Đó là lúc cần đến escape.
Trong C#, escape là cách "báo hiệu đặc biệt" cho một số ký tự trong string. Để làm vậy, dùng backslash \ (còn gọi là “backslash”).
Ký tự đặc biệt kinh điển
| Chuỗi escape | Mô tả | Demo |
|---|---|---|
| \n | Xuống dòng | Nhấn Enter |
| \t | Tab | Tab |
| \\ | Backslash "thật" | \ |
| \" | Ngoặc kép trong string | " |
| \' | Ngoặc đơn (hiếm khi cần trong string) | ' |
| \r | Carriage return (kiểu xuống dòng cũ, ít dùng) | |
| \0 | Ký tự Null | (Không thấy gì) |
| \b | Backspace (xóa ký tự trước — trên console không phải lúc nào cũng chạy) |
Nó hoạt động thế nào
Thử viết vài dòng có escape để xem nó chạy ra sao nhé.
Console.WriteLine("Chào, \"Người dùng\"!");
// Kết quả: Chào, "Người dùng"!
Console.WriteLine("C:\\Program Files\\MyApp");
// Kết quả: C:\Program Files\MyApp
Console.WriteLine("Dòng 1\nDòng 2");
// Kết quả:
// Dòng 1
// Dòng 2
Console.WriteLine("Tớ\tyêu\ttab!");
// Kết quả:
// Tớ yêu tab!
Chỉ với một dấu gạch chéo (\), bạn có thể “lùa” gần như mọi ký tự đặc biệt vào string mà không làm compiler hay đồng đội hoảng loạn.
2. String thường và string literal (@-string)
Nếu bạn phải viết backslash nhiều lần — ví dụ đường dẫn file? Lúc nào cũng gõ \\ thì đúng là cực hình. May mà C# có string literal (verbatim string), bắt đầu bằng @.
Trông nó thế nào?
string path = "C:\\Users\\Ann\\Documents\\";
string verbatimPath = @"C:\Users\Ann\Documents\";
Trong string literal, không cần escape — backslash là ký tự bình thường. Nhưng lưu ý: nếu muốn có ngoặc kép trong string này thì phải gõ đôi!
string quote = @"Đây là string literal có ngoặc kép: ""Hello""!";
Console.WriteLine(quote);
// Kết quả: Đây là string literal có ngoặc kép: "Hello"!
So sánh trực quan
| Kiểu | Cú pháp | Cách hoạt động |
|---|---|---|
| Thường | "C:\\Folder\\File.txt" | Mỗi \ — phải gõ đôi |
| Literal (@) | @"C:\Folder\File.txt" | Tất cả \ — bình thường |
| Literal có ngoặc kép | @"Text với ""ngoặc kép"" bên trong" | Ngoặc kép — phải gõ đôi |
Mẹo dân chuyên: dùng string literal cho đường dẫn file, text nhiều dòng, regex template.
3. Xuống dòng và string nhiều dòng
Rất hay phải viết message nhiều dòng hoặc ASCII-art. Cách đơn giản nhất là dùng \n trong string thường hoặc dùng string literal. String literal giữ nguyên mọi ký tự, kể cả xuống dòng. Ví dụ:
Console.WriteLine("Dòng đầu\nDòng sau");
Console.WriteLine(@"String nhiều dòng.
Không cần escape xuống dòng
Tab cũng giữ nguyên.");
Ngoài ra, C# mới có raw string literal (ba dấu ngoặc kép), cũng cho phép viết text nhiều dòng mà không phải gõ đôi ngoặc kép. Ví dụ:
string json = """
{
"name": "Alice",
"age": 30,
"skills": ["C#", "SQL", "Azure"]
}
""";
Console.WriteLine(json);
4. Unicode — C# lưu mọi ký tự trên đời như thế nào
Thời nay, tụi mình đâu chỉ dùng alphabet Latin, mà còn Cyrillic, chữ tượng hình, ký hiệu toán học, emoji nữa. Tất cả nhờ hệ mã hóa ký tự — Unicode.
Unicode là gì?
Unicode — chuẩn quốc tế gán số duy nhất (code point) cho từng ký tự, bất kể ngôn ngữ hay nền tảng. Nhờ vậy, bạn có thể dùng C# để viết text Cyrillic, tiếng Anh, tiếng Trung, ký tự lạ cùng lúc.
Ví dụ string đa ngôn ngữ:
Console.WriteLine("Hello, thế giới! 你好! مرحبا!");
Ký tự Unicode trong string
Bạn có thể gõ trực tiếp ký tự Unicode (nếu bộ mã hỗ trợ), hoặc dùng escape sequence kiểu \uXXXX, với XXXX là mã hex 4 chữ số.
Console.WriteLine("Ký tự: \u263A"); // Sẽ ra ☺
Với ký tự mã lớn hơn 65535 (nhiều emoji chẳng hạn), dùng \UXXXXXXXX (8 số):
Console.WriteLine("Emoji: \U0001F60A"); // Sẽ ra 😊
Bạn được gì từ Unicode?
- Lưu và xử lý mọi loại text.
- Đừng ngại mix ngôn ngữ, ký tự lạ — C# và .NET hỗ trợ Unicode “out of the box”.
- Rất quan trọng khi làm việc với user quốc tế và alphabet lạ.
5. Emoji và ký tự đặc biệt trong string
String hiện đại không chỉ có chữ mà còn có emoji nữa! Ví dụ, bạn muốn gửi user một message vui vẻ với “mặt cười”.
Làm sao chèn emoji vào string?
Chèn emoji trực tiếp vào string:
Chỉ cần copy emoji (ví dụ, 😊, 🚀, 🐱) rồi paste vào string:
Console.WriteLine("Chào nhé! 😊");
Dùng mã Unicode:
Với đa số emoji, dùng \U và mã 8 số.
Console.WriteLine("Đây là mèo: \U0001F431"); // 🐱
Mã emoji có thể tra trên bảng Unicode online.
Lưu ý khi làm việc với emoji
Emoji có thể chiếm 2 ký tự hoặc hơn trong string (vì mã Unicode của nó lớn hơn 16 bit).
Một số thao tác (ví dụ, lấy độ dài string) có thể “bất ngờ”:
string s = "😊";
Console.WriteLine(s.Length); // Có thể ra 2, không phải 1!
Vì codepoint emoji này được mã hóa bằng hai ký tự.
Khi in ra console hoặc web, đa số emoji sẽ hiển thị đúng nếu hệ điều hành và font hỗ trợ.
Ví dụ in string có emoji
Console.WriteLine("Chúc mừng thành công! 🎉 Bạn siêu quá! 🚀");
6. Bẫy thường gặp và lỗi phổ biến
Người mới hay nhầm lẫn escape ngoặc kép và backslash. Nếu quên escape, compiler sẽ nghĩ bạn kết thúc string sớm.
Lỗi:
Console.WriteLine("Anh ấy nói: "Chào!""); // Lỗi! Compiler hoảng loạn.
Đúng:
Console.WriteLine("Anh ấy nói: \"Chào!\"");
Hoặc khi in đường dẫn file, đôi khi lại làm thế này:
Console.WriteLine("C:\Temp\file.txt"); // Sẽ lỗi hoặc ra kết quả lạ, ví dụ: C: emp ile.txt
Vì \t và \f là ký tự đặc biệt (tab và form feed). Sửa bằng hai cách chính:
Console.WriteLine("C:\\Temp\\file.txt"); // Backslash đôi
Console.WriteLine(@"C:\Temp\file.txt"); // String literal
Lưu ý: nếu dùng string literal mà cần ngoặc kép, phải gõ đôi:
Console.WriteLine(@"File ""config.txt"" không tìm thấy."); // File "config.txt" không tìm thấy.
GO TO FULL VERSION