2009-09-16 16 views
51

Tôi đang viết chính sách TFS Checkin, kiểm tra xem tệp nguồn của chúng tôi có chứa tiêu đề tệp của chúng tôi hay không.Cách đọc tệp được mã hóa ANSI chứa các ký tự đặc biệt

Vấn đề của tôi là tiêu đề tệp của chúng tôi chứa ký tự đặc biệt "©" và rất tiếc một số tệp nguồn của chúng tôi được mã hóa trong ANSI. Vì vậy, nếu tôi đọc các tệp này trong chính sách, chuỗi sẽ trông giống như "Bản quyền 2009" này.

string content = File.ReadAllText(pendingChange.LocalItem); 

Tôi mệt mỏi khi thay đổi mã hóa của chuỗi nhưng không hiệu quả. Vì vậy, làm thế nào tôi có thể đọc các tập tin này, mà tôi nhận được chuỗi chính xác "Bản quyền © 2009"?

Nhờ sự giúp đỡ!

Trân Eny

+0

bạn vẫn đang sử dụng tiêu đề tệp? Họ dường như có giá trị nhỏ ... –

+0

@Mitch: Bạn sẽ đề xuất gì thay vì mang theo thông tin bản quyền trong mã nguồn? – AnthonyWJones

+2

Đây không phải là quyết định của chúng tôi, đó là chính sách của công ty. – Enyra

Trả lời

101

Sử dụng Encoding.Default:

string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default); 

Bạn nên biết, tuy nhiên, mà đọc nó bằng cách sử dụng mã hóa mặc định hệ thống - mà có thể không được giống như mã hóa của tập tin. Không có mã hóa đơn nào được gọi là ANSI, nhưng thường là khi mọi người nói về "mã hóa ANSI", nghĩa là mã Windows hay bất kỳ hộp nào của họ sẽ xảy ra.

Mã của bạn sẽ mạnh mẽ hơn nếu bạn có thể tìm hiểu mã vạch chính xác được sử dụng.

+0

Tôi tìm ra loại mã hóa với phần mở đầu của các mã hóa, sau đó nó hoạt động tốt, cảm ơn. – Enyra

5

Có vẻ hợp lý nếu bạn có các chính sách như vậy mà bạn cũng sẽ có nhóm mã hóa chuẩn được thỏa thuận. Thành thật mà nói, tôi không thể thấy lý do tại sao bất kỳ nhóm nào sử dụng mã hóa khác với "Unicode (UtF-8 có chữ ký) - Codepage 65001" (ngoại trừ có lẽ cho các trang ASPX có nội dung tĩnh không phải là latin nhưng thậm chí sau đó tôi có thể ' t xem làm thế nào nó sẽ là một việc lớn để sử dụng UTF-8).

Giả sử bạn vẫn muốn cho phép mã hóa hỗn hợp, sau đó bạn cần một cách để xác định mã hóa tệp nào được lưu để bạn biết mã nào cần chuyển đến ReadAllText. Nó không phải dễ dàng để xác định điều này từ tập tin tuy nhiên sử dụng Encoding.Default có khả năng làm việc ok. Vì rất có thể bạn chỉ có 2 mã hóa để xử lý, VS (UTF-8 có chữ ký) và mã hóa ANSI thông dụng được máy của bạn sử dụng (có thể là Windows-1252).

Do đó sử dụng

string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default); 

sẽ làm việc. (Như tôi thấy Jon đã đăng). Điều này làm việc bởi vì khi UTF-8 BOM (đó là những gì VS có nghĩa là thuật ngữ "chữ ký") có mặt ở đầu của tập tin tham số mã hóa được cung cấp bị bỏ qua và UTF-8 được sử dụng anyway. Do đó, nơi các tập tin được lưu bằng cách sử dụng UTF-8 bạn nhận được kết quả chính xác và nơi ANSI được sử dụng bạn có nhiều khả năng cũng để có được kết quả chính xác.

BTW nếu bạn đang xử lý tiêu đề tệp sẽ không ReadAllLines giúp mọi thứ trở nên dễ dàng hơn ?.

+0

Tôi cũng tự hỏi tại sao chúng tôi có một số tệp được mã hóa ANSI ^^ – Enyra

+0

Giải pháp của bạn chỉ sử dụng Mã hóa.Mặc định sẽ thất bại mặc dù nếu đầu vào là một tệp UTF8, nhưng không có BOM (vì không phải tất cả các tệp UTF đều có BOM). –

+1

Cảm ơn bạn đã chỉ ra rằng ngay cả khi sử dụng "Encoding.Default" nếu một BOM được tìm thấy ở đầu tệp, nó sẽ quay trở lại UTF8. Điều này đã cứu ngày của tôi. – carlos357