Regex của bạn, /\u(....)/
, có một số vấn đề.
Trước hết, \u
không hoạt động theo cách bạn nghĩ, trong 1.9 bạn sẽ gặp lỗi và trong 1.8 nó sẽ chỉ khớp với một u
đơn lẻ thay vì cặp \u
mà bạn đang tìm kiếm; bạn nên sử dụng /\\u/
để tìm số \u
theo nghĩa đen mà bạn muốn.
Thứ hai, nhóm (....)
của bạn quá dễ dãi, điều đó sẽ cho phép bất kỳ bốn ký tự nào thông qua và đó không phải là những gì bạn muốn. Trong 1.9, bạn muốn (\h{4})
(bốn chữ số thập lục phân) nhưng trong 1.8 bạn cần ([\da-fA-F]{4})
là \h
là một điều mới.
Vì vậy, nếu bạn muốn regex hoạt động ở cả 1.8 và 1.9, bạn nên sử dụng /\\u([\da-fA-F]{4})/
. Điều này cho phép bạn sau đây trong 1.8 và 1.9:
>> s = 'Where is \u03bc pancakes \u03BD house? And u1123!'
=> "Where is \\u03bc pancakes \\u03BD house? And u1123!"
>> s.gsub(/\\u([\da-fA-F]{4})/) {|m| [$1].pack("H*").unpack("n*").pack("U*")}
=> "Where is μ pancakes ν house? And u1123!"
Sử dụng pack
và unpack
để mangle số hex vào một ký tự Unicode có lẽ là đủ tốt nhưng có thể có những cách tốt hơn.
Nguồn
2011-08-10 20:18:44
Đúng vậy. Nó đến từ Rails 'ActiveSupport :: JSON và nhận được giải mã bởi ActiveSupport :: JSON, nhưng nó không giải mã được \ u thoát đúng cách. (trên Rails 2.1.2) –