bạn phải tạo encoding thì phải. Tui dùng filestream và BinaryReader để đọc file. Hiện, máy tui 0 có msdn cũng như c# nên 0 nói cụ thể được. Bạn có thể tìm như tui nói là có thông tin thôi !
Tôi có một file lưu ở dạng Unicode 16. Khi mở = EmEditor thì có thể đọc = mắt bình thường, nhưng khi tôi dùng C# để đọc từng dòng (ReadLine) thì nó chỉ đọc được ký tự đầu tiên của dòng đầu tiên thôi, các dòng còn lại đều trả ra blank.Sau hỏi 1 người bạn thì mới biết cứ sau 1 ký tự bình thường thì nó chèn thêm vào 0x00
Xin được hướng dẫn cách đọc nhị phân từng byte một để loại bỏ các ký tự 0x00 đó.
Tôi post lên nội dung file đó :
(mở trong EmEditor)
Mở trong DOS (dùng lệnh type)BEGIN:VMSG
VERSION:1.1
X-IRMC-STATUS:READ
X-IRMC-BOX:INBOX
BEGIN:VCARD
VERSION:2.1
N:
TEL:+84913568756
END:VCARD
BEGIN:VENV
BEGIN:VCARD
VERSION:2.1
N:
TEL:
END:VCARD
BEGIN:VENV
BEGIN:VBODY
Date:7/31/2006 10:20:57 PM
ve roi ha,ko mat tay,chan, vay co mat con mat nao ko?haha,ngu ngon nha.
END:VBODY
END:VENV
END:VENV
END:VMSG
B E G I N : V M S G
V E R S I O N : 1 . 1
X - I R M C - S T A T U S : R E A D
X - I R M C - B O X : I N B O X
B E G I N : V C A R D
V E R S I O N : 2 . 1
N :
T E L : + 8 4 9 1 3 5 6 8 7 5 6
E N D : V C A R D
B E G I N : V E N V
B E G I N : V C A R D
V E R S I O N : 2 . 1
N :
T E L :
E N D : V C A R D
B E G I N : V E N V
B E G I N : V B O D Y
D a t e : 7 / 3 1 / 2 0 0 6 1 0 : 2 0 : 5 7 P M
v e r o i h a , k o m a t t a y , c h a n , v a y c o m a t c o n m a t n a o k o ? h a h a , n g u n g o n n h a .
E N D : V B O D Y
E N D : V E N V
E N D : V E N V
E N D : V M S G
bạn phải tạo encoding thì phải. Tui dùng filestream và BinaryReader để đọc file. Hiện, máy tui 0 có msdn cũng như c# nên 0 nói cụ thể được. Bạn có thể tìm như tui nói là có thông tin thôi !
Bạn xem thử mấy dòng code sau đây:
Visual C# Code:
Tôi không rành về C# lắm. Nhưng qua cách mô tả của bạn về vấn đề đó thì có vẻ như bạn đã dịch và chạy chương trình trong chế độ ASSCII, như vậy hàm phương thức ReadLine sẽ hiểu là bạn muốn đọc một dòng ở chế độ ASCII (dĩ nhiên 0x00 là mã kết thúc xâu). Bạn thử dịch và chạy ở chế độ UNICODE xem (mà tôi tưởng là default là UNICODE - bạn có thể xem ở các pre processor).
Gút lắc!
Cái này liên quan đến set encoding cho các reader. Bạn có thể đọc file ở dạng từng byte 1 sau đó chuyển về string có encoding bằng lớp System.Text.Encoding(xem phương thức getString(Byte[])).Nguyên bản được gửi bởi Tarzan
Cậu dùng 1 hex editor, xem đầu file text của cậu có 2 byte FF FE hay FE FF không. Đây là 2 byte đánh dấu file UNICODE, còn gọi là BOM.
Tui đã tạo thử 2 file UNICODE 16, 1 có BOM (1) và 1 không có BOM (2). Dùng chính VS 2005 để file (1) thì mở OK, hiển thị đúng, nhưng mở file (2) thì không mở được.
Tui code thử 1 .NET console app, viết bằng C++/CLI, dùng StreamReader. Với file (1) thì mở, ReadLine và WriteLine OK, hiện ra đúng, nhưng với file (2) thì không hiển thị đúng.
Tui đang tìm hiểu tại sao và cách khắc phục. Tui đang code tổng quát, nghĩa là đọc và hiển thị được các loại file text: ASCII, UTF, UNICODE (có BOM và không BOM).
Code sau tạm chạy được, nhưng code bug nhiều.
Visual C# Code:
// PrintText.cpp : main cpp source file // Read an ASCII/Unicode text file and print to console // Compile with VS 2005, C++/CLI source, /clr compile option #include "stdafx.h" { { Console::WriteLine("Please specify a text file."); } { Console::WriteLine("File {0} not found", fileName); } { // Get static ASCII encoding. Encoding^ ascii = Encoding::ASCII; // Open the text file // Convert the string into a byte[]. { { { asciiBytes[j] = rawBytes[i]; j++; } } Console::WriteLine("{0}", lines); } // Close the file. sr->Close(); } { Console::WriteLine("Problem reading file '{0}'.\n{1}", fileName, e->Message); } }
PS: Không nhất thiết phải học C# để code .NET App, các bạn vẫn có thể tiếp tục dùng C++ để nhảy qua .NET với C++/CLI trong VS 2005. Nó được chính các MS coders đánh giá là ngôn ngữ mạnh nhất cho .NET hiện nay, trong khi C# được MS phát triển, marketing chỉ vì tính dễ học, dễ viết của nó. Rất nhiều thứ C# làm không được mà chỉ làm được với C++/CLI.
Có gì sơ sót mong các bạn góp ý.