Tôi đã biết làm thế nào để chuyển đổi các nội dung không utf8 mã hóa của một dòng tập tin bằng dòng sang UTF-8 mã hóa, sử dụng một cái gì đó giống như đoạn mã sau:Làm cách nào để chuyển đổi tệp đầu vào thành mã hóa UTF-8 trong Perl?
# outfile.txt is in GB-2312 encode
open my $filter,"<",'c:/outfile.txt';
while(<$filter>){
#convert each line of outfile.txt to UTF-8 encoding
$_ = Encode::decode("gb2312", $_);
...}
Nhưng tôi nghĩ rằng Perl có thể trực tiếp mã hóa toàn bộ tập tin đầu vào sang định dạng UTF-8, một cái gì đó vì vậy tôi đã cố gắng như
#outfile.txt is in GB-2312 encode
open my $filter,"<:utf8",'c:/outfile.txt';
(Perl nói điều gì đó như "utf8 "\ xD4" không bản đồ để Unicode")
và
open my $filter,"<",'c:/outfile.txt';
$filter = Encode::decode("gb2312", $filter);
(Perl nói "readline() trên filehandle chưa mở!)
Họ không làm việc. Nhưng có cách nào để trực tiếp chuyển đổi tập tin đầu vào sang mã hóa UTF-8 không?
Cập nhật:
Hình như mọi thứ không đơn giản như tôi nghĩ. Bây giờ tôi có thể chuyển đổi tập tin đầu vào thành mã UTF-8 theo cách đường vòng. Trước tiên, tôi mở tệp đầu vào và sau đó mã hóa nội dung của nó thành UTF-8 rồi xuất ra tệp mới và sau đó mở tệp mới để xử lý tiếp. Đây là mã:
open my $filter,'<:encoding(gb2312)','c:/outfile.txt';
open my $filter_new, '+>:utf8', 'c:/outfile_new.txt';
print $filter_new $_ while <$filter>;
while (<$filter_new>){
...
}
Nhưng đây là quá nhiều công việc và thậm chí còn phiền phức hơn việc mã hóa nội dung của dòng lọc $ theo dòng.
Bất cứ khi nào bạn đề cập đến thông báo cảnh báo trong câu hỏi, hãy bao gồm thông báo cảnh báo trong câu hỏi. :) –
@brian, cảm ơn đề xuất. – Mike
Tốt nhất là sử dụng thông điệp cảnh báo chính xác :) Vì vậy, với cảnh báo đó, bạn cần phải kiểm tra kết quả mở của bạn (mà bạn nên luôn luôn làm anyway). –