2011-12-26 28 views
5

Cách kiểm tra xem bộ ký tự có nằm trong mã hóa utf-8 không, thông qua ruby ​​| ror?Cách kiểm tra xem ký tự có phải là utf-8

+0

Bạn có nghĩa là nếu bạn đã có String trong bộ nhớ với mã hóa chính xác, hoặc làm bạn có nghĩa là trước khi bạn thậm chí bắt đầu đọc chuỗi vào bộ nhớ (ví dụ, từ một tập tin trên đĩa) ? – d11wtq

Trả lời

8

Không có cách nào xác định để làm điều này, trong Ruby hay bất cứ nơi nào khác:

str = 'foo' # start with a simple string 
# => "foo" 
str.encoding 
# => #<Encoding:UTF-8> # which is UTF-8 encoded 
str.bytes.to_a 
# => [102, 111, 111] # as you can see, it consists of three bytes 102, 111 and 111 
str.encode!('us-ascii') # now we will recode the string to 8-bit us-ascii encoding 
# => "foo" 
str.encoding 
# => #<Encoding:US-ASCII> 
str.bytes.to_a 
# => [102, 111, 111] # see, same three bytes 
str.encode!('windows-1251') # let us try some cyrillic 
# => "foo" 
str.encoding 
# => #<Encoding:Windows-1251> 
str.bytes.to_a 
# => [102, 111, 111] # see, the same three again! 

Tất nhiên, bạn có thể sử dụng một số thống kê phân tích về văn bản và loại bỏ các mã hóa mà văn bản không hợp lệ, nhưng về mặt lý thuyết, đây không phải là vấn đề có thể giải quyết được.

+0

"Không có cách xác định để làm điều này, trong Ruby cũng không phải bất cứ nơi nào khác", ah, nói như một hàn sùng bái của cuộc chiến tranh Unicode. Đã ở đó, làm điều đó, tôi cảm thấy nỗi đau của bạn. :-) Tôi cũng rơi trở lại phân tích thống kê của văn bản, mà làm việc, kinda, hầu hết thời gian. Thật tuyệt vời khi HTML, RSS và XML bị hỏng nặng có thể xảy ra khi ai đó quyết tâm làm cho mọi thứ hoạt động mà không quan tâm đến thông số kỹ thuật. –

+0

Còn về [String # valid_encoding?] (Http://ruby-doc.org/core-2.1.0/String.html#method-i-valid_encoding-3F)? Ví dụ: '" Mã hóa hợp lệ một phần \ xE4 UTF-8: äöüß ".valid_encoding?' –

+0

'valid_encoding? 'Kiểm tra xem chuỗi có chứa chuỗi byte không hợp lệ hay không. Nó không nói nếu chuỗi byte (nếu không hợp lệ) bắt nguồn từ mã hóa nhất định, và tôi tin rằng đó là câu hỏi. –

1
"your string".encoding 
# => #<Encoding:UTF-8> 

Hoặc nếu bạn muốn nó progmatically,

"your string".encoding.name == "UTF-8" 
# => true 
+5

Điều này chỉ kiểm tra một bộ mã hóa trên một đối tượng chuỗi, chứ không phải mã hóa thực tế của nội dung của nó. Không có đảm bảo rằng nội dung thực tế được mã hóa bằng cách sử dụng cùng một mã hóa. –

6

Kiểm tra UTF-8 Hiệu lực

Đối với hầu hết mã hóa đa byte nó có thể lập trình phát hiện không hợp lệ byte-chuỗi. Ruby bằng cách xử lý mặc định tất cả các chuỗi được UTF-8, bạn có thể kiểm tra xem một chuỗi được đưa ra trong hợp lệ UTF-8:

# encoding: UTF-8 
# ------------------------------------------- 
str = "Partly valid\xE4 UTF-8 encoding: äöüß" 

str.valid_encoding? 
    # => false 

str.scrub('').valid_encoding? 
    # => true 

Chuyển đổi Encoding

Ngoài ra, nếu một chuỗi không phải là mã hóa hợp lệ UTF-8, nhưng bạn biết mã hóa ký tự thực tế, bạn có thể chuyển đổi chuỗi thành mã hóa UTF-8.

Ví dụ
Đôi khi, bạn kết thúc trong một tình huống, trong đó bạn biết rằng mã hóa của một input-file là một trong hai UTF-8 hoặc CP1252 (còn gọi là Windows-1252).
Kiểm tra mà mã hóa nó là và chuyển đổi sang UTF-8 (nếu cần):

# encoding: UTF-8 
# ------------------------------------------------------ 
test = "String in CP1252 encoding: \xE4\xF6\xFC\xDF" 
File.open('input_file', 'w') {|f| f.write(test)} 

str = File.read('input_file') 

unless str.valid_encoding? 
    str.encode!('UTF-8', 'CP1252', invalid: :replace, undef: :replace, replace: '?') 
end #unless 
    # => "String CP1252 encoding: äöüß" 

=======
Ghi chú

  • Đó là lập trình có thể phát hiện hầu hết các mã hóa đa byte như UTF-8 (trong Ruby, see: #valid_encoding?) với độ tin cậy khá cao. Chỉ sau 16 byte, xác suất của một chuỗi byte ngẫu nhiên là hợp lệ UTF-8 is only 0.01%. (Hãy so sánh điều này với dựa vào UTF-8 BOM)

  • Tuy nhiên, nó là không dễ dàng có thể lập trình phát hiện (in) tính hợp lệ của đơn byte-mã hóa như CP1252 hoặc ISO-8859-1. Do đó đoạn mã trên không hoạt động theo cách khác, tức là phát hiện xem chuỗi có hợp lệ là mã hóa CP1252 không.

  • Mặc dù UTF-8 ngày càng trở nên phổ biến như mã hóa mặc định trên web, CP1252 và các hương vị khác vẫn còn rất phổ biến ở các nước phương Tây, đặc biệt là ở Bắc Mỹ. Lưu ý rằng có một số mã hóa một byte ở đó rất giống nhau, nhưng hơi khác nhau từ CP1252 (a.k.a. Windows-1252).Ví dụ: ISO-8859-1, ISO-8859-15

+0

'" Chuỗi trong mã hóa CP1252: \ xE4 \ xF6 \ xFC \ xDF "' Tôi tin câu hỏi là _how để bạn kiểm tra nó trong CP1252 encoding_. –

+0

Tôi nghĩ, câu hỏi đặt ra là nếu một chuỗi đã cho có mã hóa 'UTF-8' hợp lệ hay không. Bạn làm điều đó bằng cách gọi 'str.valid_encoding?' Trên một chuỗi 'str' có trong' UTF-8'-encoding. Điều đó không nhận được rõ ràng từ câu trả lời của tôi? –

+0

Lập trình, bạn không thể (hoặc ít nhất là không dễ dàng và dĩ nhiên không đáng tin cậy) kiểm tra tính không hợp lệ của chuỗi trong mã hóa một byte chẳng hạn như 'CP1252'. Tuy nhiên, bạn có thể khá đáng tin cậy (tùy thuộc vào độ dài của chuỗi) kiểm tra tính không hợp lệ của một chuỗi trong mã hóa nhiều byte như 'UTF-8'. –

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