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
Trả lời
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.
"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. –
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?' –
'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. –
"your string".encoding
# => #<Encoding:UTF-8>
Hoặc nếu bạn muốn nó progmatically,
"your string".encoding.name == "UTF-8"
# => true
Đ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. –
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ặcISO-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óaCP1252
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
'" 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_. –
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? –
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'. –
- 1. Cách kiểm tra xem ký tự Java có phải là ký hiệu tiền tệ không
- 2. Cách kiểm tra xem ký tự trong chuỗi có phải là một chữ cái không? Python
- 3. Kiểm tra xem chứng chỉ có phải là chứng chỉ ký tự đại diện không
- 4. Kiểm tra xem ký tự có phải là chữ cái trong Delphi (Unicode)
- 5. Kiểm tra xem đây có phải là
- 6. cách nhanh chóng để kiểm tra xem một chuỗi ký tự không phải là số
- 7. Cách kiểm tra xem java.lang.reflect.Type có phải là Enum
- 8. Cách kiểm tra xem tệp có phải là hình ảnh
- 9. Cách kiểm tra bộ ký tự của chuỗi?
- 10. Kiểm tra xem biến có phải là ngày có Twig
- 11. Kiểm tra xem một chuỗi có phải là số
- 12. Kiểm tra chuỗi UTF8 trong PHP, đây có phải là phương pháp đáng tin cậy không?
- 13. Kiểm tra xem loại biến có phải là nguyên thủy
- 14. Kiểm tra xem luồng có phải là tệp zip
- 15. Kiểm tra xem đối tượng Ruby có phải là Boolean
- 16. PHP kiểm tra xem tệp có phải là hình ảnh
- 17. Kiểm tra xem hình ảnh có phải là JPEG
- 18. Kiểm tra xem NSURL có phải là Tệp cục bộ
- 19. Kiểm tra xem char có phải là một dòng mới
- 20. C#: Kiểm tra xem loại T có phải là bool
- 21. Kiểm tra xem có phải là một đối tượng
- 22. Kiểm tra xem cửa sổ có phải là MessageBox
- 23. Ruby: Kiểm tra xem URI có phải là HTTPS không?
- 24. Chức năng kiểm tra xem chuỗi có phải là ngày
- 25. Lập trình kiểm tra xem ký tự ổ đĩa có phải là ổ đĩa mạng/chia sẻ
- 26. Cách kiểm tra xem tệp có phải là nhị phân không?
- 27. php kiểm tra xem ký tự cuối cùng có phải là '/' nếu không sau đó gắn nó trên
- 28. Kiểm tra xem chuỗi có phải là một cách viết tắt có thể cho tên
- 29. kiểm tra ký tự
- 30. java - Cách kiểm tra xem chuỗi có phải là tên phần tử XML hợp lệ không?
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