2012-05-12 29 views
6

Tệp nhập của tôi (f) có một số Unicode (tiếng Thụy Điển) không được đọc chính xác.LoadFromFile với dữ liệu Unicode

Không phải của các phương pháp hoạt động, mặc dù họ đưa ra kết quả khác nhau:

LoadFromFile(f); 

hoặc

LoadFromFile(f,TEncoding.GetEncoding(GetOEMCP)); 

Tôi đang sử dụng Delphi XE

Làm thế nào tôi có thể LoadFromFile một số dữ liệu Unicode .. ..cũng làm thế nào để tôi sau đó SaveToFile? Cảm ơn

+0

Mã hóa của tệp là gì? –

+0

Sử dụng 'TEncoding.Default' thay vì' TEncoding.GetEncoding (GetOemCP) '. –

Trả lời

10

Để tải một tệp văn bản Unicode, bạn cần biết mã hóa của nó. Nếu tệp có Dấu đơn hàng (BOM), thì bạn có thể chỉ cần gọi LoadFromFile(FileName) và RTL sẽ sử dụng BOM để xác định mã hóa.

Nếu tệp không có BOM thì bạn cần xác định rõ ràng mã hóa, ví dụ:

LoadFromFile(FileName, TEncoding.UTF8); 
LoadFromFile(FileName, TEncoding.Unicode);//UTF-16 LE 
LoadFromFile(FileName, TEncoding.BigEndianUnicode);//UTF-16 BE 

Đối với một số lý do, không biết đến tôi, không có xây dựng trong hỗ trợ cho UTF-32, nhưng nếu bạn có một tập tin như vậy thì nó sẽ là đủ dễ dàng để thêm một trường hợp TEncoding để xử lý đó.

+0

Xác định mã hóa của một tệp có vẻ có vấn đề. Dường như một số tệp UTF8 không có BOM. Điều này dường như hoạt động: InputData.LoadFromFile (f, TEncoding.UTF8); nếu InputData.count = 0 sau đó InputData.LoadFromFile (f); Có cách tiếp cận tốt hơn không. Tôi biết giải pháp này không phải là rất thanh lịch. – bobonwhidbey

+0

Đọc vài byte đầu tiên và kiểm tra các BOM đã biết. Nếu không có BOM thì bạn phải biết mã hóa. Bạn có thể đoán tốt nhưng đó là một chút hit và bỏ lỡ. –

7

Tôi giả sử rằng bạn có nghĩa là 'UTF-8' khi bạn nói 'Unicode'.

Nếu bạn biết rằng tập tin là UTF-8, sau đó làm

LoadFromFile(f, TEncoding.UTF8). 

Để tiết kiệm:

SaveToFile(f, TEncoding.UTF8); 

(. Chức năng GetOEMCP WinAPI là dành cho các bộ ký tự 255 ký tự cũ)

Các vấn đề liên quan