Khi máy chủ gửi byte UTF-8, làm cách nào để bạn đọc chúng mà không có ký tự trở thành byte thuần túy? (\ x40 vv)Trong Ruby, Làm thế nào để đọc UTF-8 từ một ổ cắm?
Trả lời
Tôi tin read_nonblock
sử dụng read
, mà lần lượt nói:
Chuỗi kết quả luôn luôn là ASCII-8 bit mã hóa.
Có nghĩa là bạn không cần phải xác định IO#set_encoding
, nhưng mà bạn có thể, sau khi bạn đọc toàn chuỗi, buộc mã hóa của nó (sử dụng String#force_encoding!
) để UTF-8
.
Tôi nhấn mạnh 'toàn bộ', vì bạn cần đảm bảo rằng bạn đọc toàn bộ ký tự Unicode ở cuối chuỗi, như thể một phần của nó được đọc, bạn sẽ nhận được ký tự UTF-8 không hợp lệ và Ruby có thể khiếu nại về nó tiếp tục xuống dòng.
Bạn có thể sử dụng IO#set_encoding để đặt mã hóa ngoài của socket thành UTF-8.
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'socket'
server_socket = TCPServer.new('localhost', 0)
Thread.new do
loop do
session_socket = server_socket.accept
session_socket.set_encoding 'ASCII-8BIT'
session_socket.puts " ᚁ ᚂ ᚃ ᚄ ᚅ ᚆ ᚇ ᚈ ᚉ ᚊ ᚋ ᚌ ᚍ"
session_socket.close
end
end
client_socket = TCPSocket.new('localhost', server_socket.addr[1])
client_socket.set_encoding 'UTF-8'
p client_socket.gets
# => "| ᚁ ᚂ ᚃ ᚄ ᚅ ᚆ ᚇ ᚈ ᚉ ᚊ ᚋ ᚌ ᚍ\n"
IO # set_encoding có hoạt động nếu tôi đang đọc các byte tắt của một socket một-by-one với #read_nonblock không? – lcarpenter
@lcarpenter, tôi không hiểu tại sao không. Bạn đã thử nó và thấy rằng nó không? –
Ah, không, phương pháp này không hoàn toàn hoạt động – lcarpenter
- 1. Làm thế nào để đọc từ một ổ cắm TCPServer trong ruby bằng cách sử dụng đọc, readpartial và read_nonblock
- 2. Đọc/Viết từ Ổ cắm Unix trong Ruby
- 3. Không thể đọc từ ổ cắm (treo)
- 4. Làm thế nào để tràn bộ đệm ổ cắm Linux?
- 5. Làm thế nào để phục vụ một ổ cắm từ một ứng dụng Java EE?
- 6. Làm cách nào để tạo 'ostream' từ ổ cắm?
- 7. Tăng ổ cắm asio: cách nhanh nhất để đọc tệp từ ổ đĩa cứng?
- 8. Làm thế nào để bạn tuôn ra ổ cắm Python?
- 9. Làm thế nào để sử dụng tệp PEM để tạo một ổ cắm SSL trong Java?
- 10. Làm thế nào để phát hiện một ổ cắm từ xa gần?
- 11. Chỉ nhận một byte từ ổ cắm
- 12. Cách tạo ổ cắm Boost.Asio từ ổ cắm gốc?
- 13. Node.js: làm thế nào để tuôn ra ổ cắm?
- 14. Đi: EOF bất ngờ khi đọc từ ổ cắm
- 15. Tách một ổ cắm riêng khỏi ổ cắm của Boost.ASIO
- 16. Làm thế nào để ngắt kết nối từ ổ cắm tcp trong NodeJs
- 17. Làm cách nào để đặt thời gian chờ của ổ cắm trong Ruby?
- 18. Làm thế nào để đóng (giết, giải phóng?) Một ổ cắm, trong trạng thái FIN_WAIT_2?
- 19. Làm thế nào để ngắt một luồng thực hiện một ổ cắm chặn kết nối?
- 20. của Ruby CSV UTF8 lỗi mã hóa trong khi đọc
- 21. Làm thế nào để đọc chính xác một dòng?
- 22. Làm thế nào để biết khi nào một Ổ cắm đã bị ngắt kết nối
- 23. Làm thế nào để thiết lập một ổ cắm Winsock UDP?
- 24. Làm thế nào để thiết lập cổng nguồn trong ổ cắm UDP trong c?
- 25. Ổ cắm trong Rust
- 26. Ổ cắm thô trong Haskell
- 27. Làm thế nào để bạn chỉ định một phạm vi cổng cho các ổ cắm Java?
- 28. Ổ cắm có thể được đóng từ một sợi khác khi gửi/recv trên cùng một ổ cắm không?
- 29. Làm thế nào để ngăn chặn các phản hồi trễ tới một ổ cắm TCP?
- 30. (Làm cách nào) Tôi có thể tìm loại ổ cắm từ bộ mô tả ổ cắm không?
Bạn đọc ổ cắm như thế nào? – Reactormonk
Sự kết hợp của IO :: select() và IO # read_nonblock – lcarpenter