2008-11-02 31 views
11

Trong RoR, cách xác thực một từ tiếng Trung hoặc tiếng Nhật cho biểu mẫu đăng bài có mã utf8.Cách sử dụng regex cho utf8 trong ruby ​​

Trong mã GBK, nó sử dụng [\ u4e00- \ u9fa5] + để xác thực các từ tiếng Trung. Trong Php, nó sử dụng/^ [\ x {4e00} - \ x {9fa5}] + $/u cho các trang utf-8.

Trả lời

10

Ruby 1.8 có hỗ trợ kém đối với các chuỗi UTF-8. Bạn cần phải viết các byte riêng trong biểu thức chính quy, chứ không phải sau đó mã đầy đủ:

>> "acentuação".scan(/\xC3\xA7/) 
=> ["ç"]  

Để phù hợp với phạm vi mà bạn chỉ định các biểu hiện sẽ trở thành một chút phức tạp:

/([\x4E-\x9E][\x00-\xFF])|(\x9F[\x00-\xA5])/ # (untested) 

That will be improved in Ruby 1.9, mặc dù.

Chỉnh sửa: Như đã lưu ý trong các nhận xét, các ký tự unicode \ u4E00- \ u9FA5 chỉ ánh xạ tới biểu thức ở trên trong mã hóa UTF16-BE. Mã hóa UTF8 có thể khác nhau. Vì vậy, bạn cần phải phân tích ánh xạ cẩn thận và xem liệu bạn có thể đưa ra một biểu thức phù hợp với byte cho Ruby 1.8 không.

+0

Regex mà bạn đánh dấu là "chưa được kiểm tra" chắc chắn không tương đương với [\ u4e00- \ u9FA5] khi xử lý văn bản UTF-8 với công cụ regex 8 bit chẳng hạn như công cụ trong Ruby 1.8. Regex của bạn sẽ chỉ hoạt động khi xử lý văn bản UTF-16BE với công cụ regex 8 bit. –

2

Động cơ regexp Oniguruma có hỗ trợ thích hợp cho Unicode. Ruby 1.9 sử dụng Oniguruma theo mặc định. Ruby 1.8 có thể được biên dịch lại để sử dụng nó.

Với Oniguruma bạn có thể sử dụng cùng một regex giống như trong PHP, bao gồm công cụ sửa đổi/u để buộc Ruby xử lý chuỗi là UTF-8.

3

Đây là những gì tôi đã làm:

%r{^[#{"\344\270\200"}-#{"\351\277\277"}]+$} 

này về cơ bản là một biểu hiện thường xuyên với các giá trị bát phân đại diện cho khoảng giữa U + 4E00 và U + 9FFF, các nhân vật phổ biến nhất Trung Quốc và Nhật Bản.

Các vấn đề liên quan