Computer >> Máy Tính >  >> Lập trình >> Ruby

Hiểu về Ruby:Mã hóa chuỗi, ASCII &Unicode

Làm thế nào để các chuỗi ký tự có thể tồn tại trong một thế giới mà máy tính chỉ hiểu các chuỗi ký tự và ký tự không?

Chà…

Giống như chúng ta có thể ánh xạ một tên miền với một địa chỉ IP.

Hoặc mã vạch cho một sản phẩm cụ thể.

Chúng tôi có thể…

Ánh xạ số thành ký tự!

Giống như 97 thành "a" .

Hoặc 122 thành "z" .

Đó chính xác là cách chúng ta có thể có các ký tự trong thế giới số.

Nhưng những con số nào đi cùng với những ký tự nào?

Để trả lời câu hỏi đó, chúng tôi đã phát minh ra các hệ thống ánh xạ ký tự khác nhau.

Bắt đầu với ASCII.

ASCII là viết tắt của “American Standard Code for Information Interchange”.

Bạn có thể tìm thấy một bảng ASCII hoặc bạn có thể yêu cầu Ruby chuyển đổi các ký tự thành giá trị ASCII của chúng.

Như thế này :

"a".ord
# 97

Đối với nhiều ký tự :

"abc".bytes
# [97, 98, 99]

Nếu bạn có một số nguyên, bạn có thể lấy ký tự được liên kết.

Như thế này :

97.chr
# "a"

Mã hóa ASCII bao gồm :

  • Kiểm soát các ký tự (như dòng mới, tab, rỗng)
  • Các ký hiệu (như dấu ngoặc đơn, dấu bằng, dấu chấm hỏi)
  • Số (0-9)
  • Ký tự (a-z, A-Z)

Như chúng ta sẽ thấy ở phần sau của bài viết này, phạm vi ký tự này bị giới hạn.

Tại sao?

Bởi vì nó không bao gồm các ký tự &ký hiệu từ các ngôn ngữ khác, như tiếng Trung hoặc tiếng Nhật.

ASCII trong thế giới thực

Toàn bộ ánh xạ số thành chuỗi này sẽ diễn ra đằng sau hậu trường cho bạn.

Nhưng có một số công dụng thực tế!

Ví dụ :

Đặc tả HTTP không cho phép một số ký tự nhất định bên trong URL.

Nhưng bạn có thể mã hóa các ký tự không hợp lệ này ở định dạng ASCII và hầu hết các máy chủ web hiện đại sẽ diễn giải chúng một cách chính xác.

example.com/a+++ => example.com/a%2B%2B%2B

%2B là gì ?

Đó là ký tự + , ở định dạng được mã hóa ASCII.

Bạn cũng có thể sử dụng kiến ​​thức này để biến đổi các ký tự.

Ví dụ :

Nếu bạn nhìn vào bảng ASCII, bạn sẽ nhận thấy rằng bạn có thể chuyển đổi một ký tự chữ thường thành chữ hoa bằng cách lấy nó trừ đi 32.

("a".ord - 32).chr
# "A"

Điều đó cũng hoạt động theo cách khác.

("A".ord + 32).chr
# "a"

Có.

Trong Ruby, chúng ta có upcase &downcase phương pháp.

Nhưng điều này có thể hữu ích cho bạn trong một số loại câu hỏi phỏng vấn, thử thách viết mã hoặc tình huống tương tự.

Unicode là gì?

ASCII chỉ có thể mã hóa tối đa 127 ký tự khác nhau (256 với ASCII mở rộng), điều này giới hạn những ký tự mà chúng tôi có thể đại diện.

Giải pháp?

Unicode.

Unicode là một hệ thống mã hóa chuỗi có thể đại diện cho tối đa một triệu ký tự khác nhau .

Đó là nhiều không gian hơn ASCII!

Giờ đây, chúng tôi có thể bao gồm các ký tự từ tất cả các loại ngôn ngữ, biểu tượng mới và thậm chí cả biểu tượng cảm xúc.

Đây là một số mã Unicode :

ɑΩϕβΣπ

Đây là các ký tự từ bảng chữ cái Hy Lạp không thể hiển thị bằng ASCII.

Cách sử dụng Unicode trong Ruby

Ruby có hỗ trợ Unicode, nó được bật theo mặc định kể từ Ruby 1.9.

Vì vậy, bạn có thể làm điều này :

π = 3.141592

Hoặc cái này :

def ★★★
  puts "You get 3 stars, great job!"
end

★★★
# "You get 3 stars, great job!"

Khá vui!

Nhưng có lẽ không thực tế khi xác định các phương pháp và biến bằng cách sử dụng các ký hiệu này vì chúng không có trong bàn phím của chúng tôi.

Trên thực tế, có những ký tự Unicode hợp lệ, không nhìn thấy được.

Ví dụ :

def ​
  puts "Invisible method"
end
​

Đây có vẻ như là một phương thức không có tên, thường không được phép.

Nhưng nó hoạt động nhờ ký tự Unicode vô hình đó!

Phương pháp mã hóa chuỗi

Ruby có các phương pháp để làm việc với các hệ thống mã hóa khác nhau.

Ví dụ :

"abc".encoding.name
# "UTF-8"

Có một số trường hợp đặc biệt trong đó mã hóa hiện tại (encoding.name ) không khớp với mã hóa thực tế của chuỗi.

Bạn có thể tìm thấy điều này khi đọc dữ liệu từ một trang web, tệp, cơ sở dữ liệu hoặc một nguồn bên ngoài khác.

Điều này sẽ dẫn đến một InvalidByteSequenceError .

Nếu điều đó xảy ra bạn sẽ cần thay đổi mã hóa .

Làm thế nào?

Sử dụng encode phương pháp:

"abcΣΣΣ".encode("ASCII", "UTF-8", undef: :replace)

# "abc???"

Tôi đang chuyển đổi từ UTF-8 (Unicode) tới ASCII và vì Σ ký tự không có sẵn trong ASCII, chúng tôi yêu cầu Ruby thay thế nó.

Theo mặc định, điều này thay thế các ký tự không xác định bằng dấu chấm hỏi.

Nhưng bạn có thể thay đổi điều đó.

Như thế này :

"abcΣΣΣ".encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "")

# "abc"

Hoặc sử dụng tùy chọn "dự phòng" :

"abcΣΣΣ".encode("ASCII", "UTF-8", fallback: {"Σ" => "E"})

# "abcEEE"

Điều này đang nói :

“Thay thế tất cả các ký tự từ UTF-8 (Unicode) thành ASCII, sử dụng hàm băm dự phòng để dịch các ký tự không tồn tại trong ASCII”.

Một phương pháp khác, force_encoding , thay đổi mã hóa mà không có bước dịch này.

Ví dụ :

"abc½½½".force_encoding("iso-8859-1")

Bạn có thể lấy danh sách các bảng mã có sẵn bằng Encoding.aliases phương pháp.

Tóm tắt

Bạn đã học cách máy tính tạo ký tự từ số bằng cách sử dụng bảng mã hóa! Bạn cũng đã học về ASCII &Unicode trong Ruby.

Bây giờ, hãy mở trình chỉnh sửa của bạn và thực hành vui vẻ 😃

Cảm ơn vì đã đọc.