Có cách nào được chấp nhận để xử lý các cụm từ thông dụng trong Ruby 1.9 mà mã hóa đầu vào không xác định? Hãy nói rằng đầu vào của tôi xảy ra là UTF-16 mã hóa:Ruby 1.9: Cụm từ thông dụng với mã hóa đầu vào không xác định
x = "foo<p>bar</p>baz"
y = x.encode('UTF-16LE')
re = /<p>(.*)<\/p>/
x.match(re)
=> #<MatchData "<p>bar</p>" 1:"bar">
y.match(re)
Encoding::CompatibilityError: incompatible encoding regexp match (US-ASCII regexp with UTF-16LE string)
cách tiếp cận hiện tại của tôi là sử dụng UTF-8 trong nội bộ và tái mã hóa (một bản sao của) đầu vào nếu cần thiết:
if y.methods.include?(:encode) # Ruby 1.8 compatibility
if y.encoding.name != 'UTF-8'
y = y.encode('UTF-8')
end
end
y.match(/<p>(.*)<\/p>/u)
=> #<MatchData "<p>bar</p>" 1:"bar">
Tuy nhiên, điều này có vẻ hơi khó xử với tôi, và tôi muốn hỏi liệu có cách nào tốt hơn để làm điều đó không.
Cảm ơn! Nó đã không xảy ra với tôi để làm điều đó theo cách khác tròn và mã hóa Regexp. Điều đó thực sự nhanh hơn rất nhiều! Đối với bất kỳ ai khác cố gắng thực hiện việc này: Hãy coi chừng mã hóa giả ('#dummy?') Khi bạn thử kiểm tra mã của mình. Đã cho tôi một thời gian để tìm ra lý do tại sao nó không hoạt động. – DataWraith
Đồng ý về hiệu suất - Tôi thấy nó nhanh hơn theo cấp số nhân để ghi nhớ regex. Nhanh chóng hack tại đây để xử lý các khoảng trắng: https://gist.github.com/mahemoff/c877eb1e955b1160dcdf6f4d4c0ba043 – mahemoff