Hai điểm bắt đầu:Đúng là chuyển đổi IO của perl mặc định thành utf-8 trong khi sử dụng Plack và Middlewares?
- Trong his answer to Why does modern Perl avoid UTF-8 by default? tchrist chỉ ra 52 điều cần thiết để đảm bảo chính xác Unicode xử lý trong Perl. Câu trả lời cho thấy mã soạn sẵn với một số câu lệnh
use
. Câu hỏi tương tự về việc sử dụng Unicode là How to make "use My::defaults" with modern perl & utf8 defaults? PSGI spec theo định hướng byte thiết kế. Đó là trách nhiệm của tôi để mã hóa/giải mã tất cả mọi thứ, vì vậy cho Plack ứng dụng một cách chính xác là để mã hóa đầu ra và giải mã đầu vào, ví dụ:
use Encode; my $app = sub { my $output = encode_utf8(myapp()); return [ 200, [ 'Content-Type' =>'text/plain' ], [ $str ] ]; };
Là nó đúng để sử dụng
use uni::perl; # or any similar
trong ứng dụng PSGI và/hoặc trong các mô-đun của tôi?
uni::perl
thay đổi mặc định Perl của IO sang UTF-8, như sau:
use open qw(:std :utf8);
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
Will làm như vậy phá vỡ một cái gì đó trong Plack hoặc middlewares của nó? Hoặc là cách chính xác để viết ứng dụng cho Plack mã hóa/giải mã một cách rõ ràng khi mở, vì vậy không có open
pragma?
Plack có ghi vào STDOUT hoặc đọc từ STDIN không? Nếu vậy, nó gần như chắc chắn sai (trừ khi họ cũng là một lỗi trong Plack). Tôi nói "gần như" vì việc sử dụng 'binmode' trong Plack sẽ khiến nó không quan tâm. PS - bây giờ bạn biết tại sao nó không được thực hiện theo mặc định; nó phá vỡ công cụ. – ikegami
Tôi hy vọng hơn @miyagawa gurusan sẽ nói thêm .. :) Và tôi hiểu tại sao utf8 không phải là mặc định, nhưng, (IMO) các mô-đun CPAN mới nên được phát triển với "perl -CSDA" hoặc với 'env PERL_UNICODE' trong tâm trí. Và miyagawa chắc chắn sử dụng nó trong môi trường Nhật Bản, vì vậy, nên biết đúng cách ..;) – cajwine
Tôi nghĩ rằng "đúng cách" bạn danh sách bị hỏng. 'text/plain' cần một bộ ký tự để phía bên kia biết những byte nào đại diện và cách giải mã chúng. – Ashley