2009-03-20 31 views
17

Ví dụ: "½" hoặc ASCII DEC 189. Khi tôi đọc byte từ tệp văn bản, byte [] chứa giá trị hợp lệ, trong trường hợp này là 189.Làm cách nào để chuyển đổi ascii mở rộng thành System.String?

Chuyển đổi sang Unicode dẫn đến ký tự thay thế Unicode 65533 .

UnicodeEncoding.Unicode.GetString (b);

Chuyển đổi thành kết quả ASCII bằng 63 hoặc "?"

ASCIIEncoding.ASCII.GetString (b);

Nếu điều này là không thể, cách tốt nhất để xử lý dữ liệu này là gì? Tôi muốn có thể thực hiện các chức năng chuỗi như Replace().

Trả lời

24

Byte 189 đại diện cho một "½" trong iso-8859-1 (aka "Latin-1"), vì vậy sau đây là có lẽ những gì bạn muốn:

var e = Encoding.GetEncoding("iso-8859-1"); 
var s = e.GetString(new byte[] { 189 }); 

Tất cả các chuỗi và ký tự trong .NET là UTF-16 được mã hóa, vì vậy bạn cần sử dụng bộ mã hóa/bộ giải mã để chuyển đổi bất kỳ thứ gì khác, đôi khi điều này được mặc định (ví dụ: UTF-8 cho các phiên bản FileStream) nhưng thực hành tốt là luôn luôn chỉ định.

Bạn sẽ cần một số loại siêu dữ liệu rõ ràng tiềm ẩn hoặc (tốt hơn) để cung cấp cho bạn thông tin về mã hóa nào.

+1

Công cụ mã hóa này đã khiến tôi phát điên ... nhưng câu trả lời của bạn đã giúp tôi! Phải mất một thời gian để tìm ra những gì để tìm kiếm nhưng cuối cùng tôi đã tìm ra những điều kiện tìm kiếm thích hợp nên được. :) Cảm ơn bạn đã cung cấp cho tôi giải pháp đơn giản cho vấn đề của tôi. :) – Dave

10

Nó phụ thuộc vào chính xác mã hóa là gì.

Không có điều nào như "ASCII 189" - ASCII chỉ lên tới 127. Có nhiều mã hóa mã hóa 8 bit sử dụng ASCII cho 128 giá trị đầu tiên.

Bạn có thể muốn Encoding.Default (đây là mã hóa mặc định cho hệ thống cụ thể của bạn), nhưng thật khó để biết chắc chắn. Dữ liệu của bạn đến từ đâu?

+0

Những gì tôi đang đọc của họ vào các dòng byte [] với 188 - 190 trong biểu đồ ascii mở rộng này: http://charlie.balch.org/asp/ascii.asp. Mã hóa. Đã xảy ra lỗi.Cảm ơn nhiều! – rtremaine

+1

Vui khi nó hoạt động - chỉ cần lưu ý rằng bất cứ ai nói về "ASCII mở rộng" như thể điều đó có nghĩa là một mã hóa cụ thể không biết họ đang nói về cái gì. Nó giống như nói về "một đô la" - một đô la Mỹ, đô la Úc, đô la Canada, cái gì? Nó có thể có ý nghĩa trong một bối cảnh cụ thể –

+0

nhưng nó không phải là một ý tưởng dứt khoát và độc đáo. Vì vậy, tôi dám nói ý tưởng của Charlie về "ASCII mở rộng" là thích hợp cho * văn hóa của mình * - nhưng nó sẽ không phù hợp với những gì xảy ra trên một số máy tính của người khác. –

12

Bộ ký tự PC-8 hoặc Extended ASCII cũ xung quanh trước khi IBM và Microsoft giới thiệu ý tưởng về trang mã cho thế giới PC. Điều này đã được mở rộng ASCII - vào năm 1982. Trên thực tế, đó là bộ ký tự CHỈ có sẵn trên PC vào thời điểm đó, cho đến khi thẻ EGA cho phép bạn tải các phông chữ khác vào VRAM.

Đây cũng là chuẩn mặc định cho các thiết bị đầu cuối ANSI, và gần như mọi BBS tôi đã gọi đến trong thập niên 80 và đầu 90 đều sử dụng bộ ký tự này để hiển thị các menu và hộp.

Đây là mã để biến ASCII mở rộng 8 bit thành văn bản Unicode. Lưu ý bit chính của mã: GetEncoding ("437"). Điều đó đã sử dụng Mã số 437 để dịch văn bản ASCII 8 bit thành Unicode tương đương.

string ASCII8ToString(byte[] ASCIIData) 
    { 
     var e = Encoding.GetEncoding("437"); 
     return e.GetString(ASCIIData); 
    } 
+0

Wow! Cảm ơn bạn! Là một lưu ý phụ, câu trả lời của bạn cũng là một giải pháp thực sự tốt cho cách biến một mảng byte thành một chuỗi và ngược lại. – mike

1

System.String[] không thể lưu trữ ký tự với ASCII > 127 nếu bạn đang cố gắng để làm việc trên bất kỳ các ký tự ASCII mở rộng như œ ¢ ½ ¾here là phương pháp để chuyển đổi nó thành nhị phân và thập phân tương đương

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