ทำไมการเข้ารหัสไม่ควรใช้ข้อผิดพลาด ...
คำตอบของ @ Randall ใช้Encoding.Default
อย่างไรก็ตาม Microsoft แจ้งเตือน :
คอมพิวเตอร์หลายเครื่องสามารถใช้การเข้ารหัสที่แตกต่างกันเป็นค่าเริ่มต้นและการเข้ารหัสเริ่มต้นสามารถเปลี่ยนแปลงได้ในคอมพิวเตอร์เครื่องเดียว หากคุณใช้การเข้ารหัสเริ่มต้นเพื่อเข้ารหัสและถอดรหัสข้อมูลที่สตรีมระหว่างคอมพิวเตอร์หรือดึงข้อมูลในเวลาที่ต่างกันในคอมพิวเตอร์เครื่องเดียวกันอาจแปลข้อมูลนั้นไม่ถูกต้อง นอกจากนี้การเข้ารหัสที่ส่งคืนโดยคุณสมบัติเริ่มต้นจะใช้ทางเลือกที่เหมาะสมที่สุดเพื่อแมปอักขระที่ไม่ได้รับการสนับสนุนกับอักขระที่สนับสนุนโดยหน้ารหัส ด้วยเหตุผลเหล่านี้ไม่แนะนำให้ใช้การเข้ารหัสเริ่มต้น เพื่อให้แน่ใจว่าไบต์ที่เข้ารหัสถูกถอดรหัสอย่างถูกต้องคุณควรใช้การเข้ารหัส Unicode เช่น UTF8Encoding หรือ UnicodeEncoding คุณสามารถใช้โปรโตคอลระดับสูงกว่าเพื่อให้แน่ใจว่าใช้รูปแบบเดียวกันสำหรับการเข้ารหัสและถอดรหัส
ในการตรวจสอบว่าการเข้ารหัสเริ่มต้นคืออะไรใช้Encoding.Default.WindowsCodePage
(1250 ในกรณีของฉัน - และน่าเศร้าที่ไม่มีการเข้ารหัสคลาส CP1250 ที่กำหนดไว้ล่วงหน้า แต่วัตถุสามารถดึงได้ในรูปแบบEncoding.GetEncoding(1250)
)
Encoding.ASCII
เป็น 7 บิตดังนั้นจึงไม่ทำงานเช่นกันในกรณีของฉัน:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... และทำไมการเข้ารหัส UTF-8 ควรใช้แทน ...
การเข้ารหัสเริ่มต้นทำให้เข้าใจผิด:. NET ใช้ UTF-8 ทุกหนทุกแห่งเป็นค่าเริ่มต้นจริง (การเข้ารหัส 8 บิตกลายเป็นสิ่งล้าสมัยในตอนท้ายของศตวรรษที่ 20 ตรวจสอบเช่น Console.OutputEncoding.EncodingName
*) ดังนั้นค่าคงที่ที่คุณกำหนดในรหัสคือ UTF-8 เข้ารหัสตามค่าเริ่มต้น ควรใช้อันนี้เว้นแต่แหล่งข้อมูลจะมีการเข้ารหัสที่แตกต่าง
* นี่คือ UTF-8 ในกรณีของฉันซึ่งเป็นการโกหกโดยตรง: chcp
จาก windows console (cmd) ส่งคืน 852 - และสิ่งนี้ไม่ควรเปลี่ยนแปลงเนื่องจากคำสั่งระบบที่แปลเป็นภาษาท้องถิ่น (เช่น ping) มีรหัสเพจนี้
ทำตามคำแนะนำของ Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
แนะนำโดยผู้อื่นเป็นตัวอย่างการเข้ารหัส uf UTF-8 และสามารถใช้โดยตรงหรือเป็น
var utf8 = Encoding.UTF8 as UTF8Encoding;
... แต่มันไม่ได้ใช้เสมอ
การเข้ารหัสอาร์เรย์ไบต์ควร "ทำงานได้" ใน Unicode ในประเทศตะวันตก แต่ทันทีที่คุณย้ายโปรแกรมของคุณไปยังบางพื้นที่ที่ไม่รองรับ (เช่นที่นี่ในยุโรปตะวันออก) มันเป็นเรื่องยุ่งเหยิง: ในค่าเริ่มต้นของสาธารณรัฐเช็ก Windows (ในปี 2020!) MS ที่ไม่ได้มาตรฐาน 852 (aka ละติน -2) สำหรับคอนโซล 1250 เป็น Windows OEM, UTF-8 (65001) เป็น. NET (และอื่น ๆ ) เริ่มต้นใหม่และเราควรทราบว่า 8bit EU ตะวันตกบางตัว ข้อมูลยังคงอยู่ใน 1,252 ในขณะที่ 8bit ตะวันตกมาตรฐานเก่าสำหรับยุโรปตะวันออกคือ ISO-8859-2 (aka ละติน -2 แต่ไม่ใช่ Latin-2 เดียวกับ 852) การใช้ ASCII หมายถึงข้อความที่เต็มไปด้วยเต้าหู้และ '?' ที่นี่ จนครึ่งหนึ่งของศตวรรษที่ 21, กรุณาตั้งค่า UTF-8 อย่างชัดเจน
searchResult.Properties["user"][0]
อะไร ลองส่งไปbyte[]
ก่อน