Tại sao Encoding.Default không nên được sử dụng ...
Câu trả lời của @ Randall sử dụng Encoding.Default
, tuy nhiên Microsoft đưa ra cảnh báo chống lại nó :
Các máy tính khác nhau có thể sử dụng các bảng mã khác nhau làm mặc định và mã hóa mặc định có thể thay đổi trên một máy tính. Nếu bạn sử dụng mã hóa Mặc định để mã hóa và giải mã dữ liệu được truyền phát giữa các máy tính hoặc được truy xuất tại các thời điểm khác nhau trên cùng một máy tính, nó có thể dịch dữ liệu đó không chính xác. Ngoài ra, mã hóa được trả về bởi thuộc tính Mặc định sử dụng dự phòng phù hợp nhất để ánh xạ các ký tự không được hỗ trợ thành các ký tự được trang mã hỗ trợ. Vì những lý do này, không nên sử dụng mã hóa mặc định. Để đảm bảo rằng các byte được mã hóa được giải mã chính xác, bạn nên sử dụng mã hóa Unicode, chẳng hạn như UTF8Encoding hoặc UnicodeEncoding. Bạn cũng có thể sử dụng giao thức cấp cao hơn để đảm bảo rằng định dạng tương tự được sử dụng để mã hóa và giải mã.
Để kiểm tra mã hóa mặc định là gì, hãy sử dụng Encoding.Default.WindowsCodePage
(1250 trong trường hợp của tôi - và thật đáng buồn, không có lớp mã hóa CP1250 được xác định trước, nhưng đối tượng có thể được truy xuất dưới dạng Encoding.GetEncoding(1250)
).
Encoding.ASCII
là 7 bit, vì vậy, nó cũng không hoạt động, trong trường hợp của tôi:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... và tại sao nên sử dụng mã hóa UTF-8 thay thế ...
Mã hóa mặc định là sai lệch: .NET sử dụng UTF-8 ở mọi nơi vì mặc định thực (mã hóa 8 bit trở nên lỗi thời vào cuối thế kỷ 20., kiểm tra tức là Console.OutputEncoding.EncodingName
*) để mọi hằng số bạn xác định trong mã đều được mã hóa theo mặc định - vì vậy cái này nên được sử dụng trừ khi nguồn dữ liệu ở dạng mã hóa khác nhau.
* Đây là UTF-8 trong trường hợp của tôi là lời nói dối trực tiếp: chcp
từ bảng điều khiển windows (cmd) trả về 852 - và điều này không nên thay đổi, vì các lệnh hệ thống cục bộ (như ping) đã được mã hóa mã hóa này
Theo khuyến nghị của Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
được đề xuất bởi những người khác là một ví dụ mã hóa UTF-8 và cũng có thể được sử dụng trực tiếp hoặc như
var utf8 = Encoding.UTF8 as UTF8Encoding;
... nhưng nó không được sử dụng luôn
Mã hóa cho mảng byte sẽ "chỉ hoạt động" bằng Unicode ở các nước phương Tây, nhưng ngay khi bạn chuyển chương trình của mình sang một số khu vực ít được hỗ trợ hơn (như ở đây ở Đông Âu), đó là một mớ hỗn độn thực sự: ở Cộng hòa Séc, Windows sử dụng mặc định (vào năm 2020!) MS không chuẩn 852 (còn gọi là Latin-2) cho bảng điều khiển, 1250 là Windows OEM, UTF-8 (65001) là .NET (và các loại khác) mặc định mới và chúng ta nên nhớ rằng một số 8bit phía tây EU dữ liệu vẫn còn trong năm 1252, trong khi tiêu chuẩn phương Tây 8 bit cũ cho Đông Âu là ISO-8859-2 (còn gọi là Latin-2, nhưng KHÔNG cùng Latin-2 với 852). Sử dụng ASCII có nghĩa là văn bản đầy đậu phụ và '?' đây. Vì vậy, cho đến nửa thế kỷ 21, vui lòng đặt UTF-8 một cách rõ ràng .
searchResult.Properties["user"][0]
gì? Hãy thử truyền nó lênbyte[]
đầu tiên