Tôi đoán rằng "\xBF"
đã nghĩ rằng nó được mã hóa theo UTF-8 vì vậy khi bạn gọi encode
, nó nghĩ rằng bạn đang cố gắng để mã hóa một chuỗi UTF-8 trong UTF-8 và không có gì:
>> s = "\xBF"
=> "\xBF"
>> s.encoding
=> #<Encoding:UTF-8>
\xBF
không hợp lệ UTF-8 vì vậy, điều này tất nhiên là vô lý. Nhưng nếu bạn sử dụng hình thức ba đối số của encode
:
mã hóa (dst_encoding, src_encoding [, tùy chọn]) → str
[...] Các hình thức thứ hai trả về một bản sao của str
chuyển mã từ src_encoding
đến dst_encoding
.
Bạn có thể buộc các vấn đề bằng cách nói encode
để bỏ qua những gì các chuỗi nghĩ mã hóa của nó là gì và đối xử với nó như là dữ liệu nhị phân:
>> foo = s.encode('utf-8', 'binary', :invalid => :replace, :undef => :replace)
=> "�"
đâu s
là "\xBF"
mà nghĩ rằng nó là UTF-8 từ ở trên.
Bạn cũng có thể sử dụng force_encoding
trên s
để buộc nó phải nhị phân và sau đó sử dụng hai tham số encode
:
>> s.encoding
=> #<Encoding:UTF-8>
>> s.force_encoding('binary')
=> "\xBF"
>> s.encoding
=> #<Encoding:ASCII-8BIT>
>> foo = s.encode('utf-8', :invalid => :replace, :undef => :replace)
=> "�"
Nguồn
2012-05-05 21:50:59
Cảm ơn! Sử dụng 'ascii' làm từ mã hóa cũng hoạt động. – drewinglis
@drewinglis: Tôi thích sự giải thích về "nhị phân" (là bí danh cho "ascii-8bit"), "ascii" không giống hệt nhau. –