Tôi đang sử dụng Ruby 1.9 để mở một số tệp và sao chép chúng vào tệp lưu trữ. Bây giờ có một số tập tin nhị phân, nhưng một số thì không. Vì Ruby 1.9 không tự động mở tệp nhị phân dưới dạng tệp nhị phân, có cách nào để tự động mở chúng không? (Vì vậy, ".class" sẽ là nhị phân, ".txt" không)Tự động mở tệp dưới dạng nhị phân với Ruby
Trả lời
Thực ra, câu trả lời trước đó của Alex D chưa hoàn thành. Trong khi đó là sự thật rằng không có chế độ "văn bản" trong các hệ thống tập tin Unix, Ruby không tạo sự khác biệt giữa việc mở tập tin trong chế độ nhị phân và phi nhị phân:
s = File.open('/tmp/test.jpg', 'r') { |io| io.read }
s.encoding
=> #<Encoding:UTF-8>
là khác nhau từ (chú ý "rb"
)
s = File.open('/tmp/test.jpg', 'rb') { |io| io.read }
s.encoding
=> #<Encoding:ASCII-8BIT>
Cách thứ hai, như là docs nói, đặt mã hóa bên ngoài thành ASCII-8BIT, thông báo cho Ruby không cố gắng diễn giải kết quả tại UTF-8. Bạn có thể đạt được điều tương tự bằng cách đặt mã hóa một cách rõ ràng với s.force_encoding('ASCII-8BIT')
. Đây là điều quan trọng nếu bạn muốn đọc nhị phân thành chuỗi và di chuyển chúng xung quanh (ví dụ: lưu chúng vào cơ sở dữ liệu, v.v.).
Trên nền tảng giống Unix, không có sự khác biệt giữa mở tệp trong chế độ "nhị phân" và "văn bản". Trên Windows, chế độ "văn bản" chuyển đổi ngắt dòng sang kiểu DOS và chế độ "nhị phân" thì không.
Trừ khi bạn cần chuyển đổi dòng trên nền tảng Windows, chỉ cần mở tất cả các tệp ở chế độ "nhị phân". Không có hại trong việc đọc một tập tin văn bản trong chế độ "nhị phân".
Nếu bạn thực sự muốn phân biệt, bạn sẽ phải khớp với File.extname (tên tệp) dựa vào danh sách các tiện ích mở rộng đã biết như ".txt" và ".class".
Kể từ của Ruby 1.9.1 có một phương pháp riêng biệt cho việc đọc nhị phân (IO.binread
) và kể từ 1.9.3 có một cho văn bản (IO.binwrite
) cũng như:
Để đọc:
content = IO.binread(file)
Đối viết:
IO.binwrite(file, content)
Kể từ IO
là lớp cha của File
, bạn cũng có thể làm wh sau ich có thể mang tính biểu cảm hơn:
content = File.binread(file)
File.binwrite(file, content)
File.binread (file) cũng có thể là – peter
Có, vì cha của lớp 'File' là lớp' IO'. –
- 1. trong tệp C++: tệp được mở dưới dạng ios :: nhị phân khác với tệp được mở dưới dạng ios :: binary | ios :: ra?
- 2. Lưu khung dữ liệu dưới dạng tệp nhị phân
- 3. Serialize DateTime dưới dạng nhị phân
- 4. Phân tích tệp nhị phân trong Ruby
- 5. Lua: viết giá trị thập lục phân dưới dạng tệp nhị phân
- 6. Tải xuống dữ liệu nhị phân dưới dạng tệp qua Javascript
- 7. Làm cách nào để Git xử lý tệp dưới dạng nhị phân?
- 8. Hoạt động nhị phân trên tệp nhị phân Erlang?
- 9. tài liệu mở từ (được lưu dưới dạng nhị phân) từ cơ sở dữ liệu
- 10. Tự động hóa Excel: Mở tệp Excel hiện có dưới dạng "mới"
- 11. Git SVN với các tệp nhị phân
- 12. API tệp HTML5 được đọc dưới dạng văn bản và nhị phân
- 13. Cách xác định nội dung tệp dưới dạng ASCII hoặc nhị phân
- 14. Đọc một tệp nhị phân với python
- 15. Giúp tôi hiểu định dạng tệp nhị phân này
- 16. Phân tích từng tệp trong thư mục với BeautifulSoup/Python, lưu dưới dạng tệp mới
- 17. Đọc/Viết Tệp nhị phân
- 18. StringIO với các tệp nhị phân?
- 19. mở tệp dưới con trỏ trong cửa sổ phân tách
- 20. Hiển thị tệp ở định dạng nhị phân
- 21. Cách hiển thị dữ liệu nhị phân dưới dạng ảnh - extjs 4
- 22. Mở một tệp Excel và lưu dưới dạng .XLS
- 23. Tính tương tự dữ liệu nhị phân
- 24. Liên kết tự động Facebook mở ra dưới dạng bản đồ trên điện thoại
- 25. Nhập tệp văn bản dưới dạng chuỗi ký tự đơn
- 26. sharpNLP dưới dạng phần mở rộng tệp .nbin
- 27. Thực hiện cây nhị phân trong Ruby
- 28. Tải khóa nhị phân PKCS # 8 vào Ruby
- 29. Tăng hiệu suất tuần tự hóa: văn bản so với định dạng nhị phân
- 30. Kết hợp nhiều tệp nhị phân .NET với nhau?
Lưu ý rằng câu trả lời này là sai. Ruby đọc vào một chuỗi, và đến 1.9 chuỗi đó có một mã hóa liên kết với nó. Xem thêm câu trả lời cao cấp để biết chi tiết và bỏ qua điều này. Nếu Alex có thể xóa nó sẽ thích hợp hơn. –
Nếu tôi chỉ xóa nó, câu trả lời hiện tại sẽ không có ý nghĩa ("câu trả lời của AlexD ..."). Sẽ tốt hơn nếu thông tin trong câu trả lời này (đề cập đến ảnh hưởng của lá cờ 'b' trên chuyển đổi dòng) được hợp nhất với thông tin ở đầu kia. –