WebClientDownloadString ส่งผลให้อักขระที่ยุ่งเหยิงเนื่องจากปัญหาการเข้ารหัส แต่เบราว์เซอร์ไม่เป็นไร


86

รหัสต่อไปนี้:

var text = (new WebClient()).DownloadString("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20"));

ส่งผลให้ตัวแปรtextมีสตริงเหนือสิ่งอื่นใด

"$ κ $ -Minkowski สเปซฟิลด์สเกลาร์และปัญหาความไม่แปรเปลี่ยนของลอเรนซ์"

อย่างไรก็ตามเมื่อฉันไปที่ URL นั้นใน Firefox ฉันจะได้รับ

$ κ $ -Minkowski สเปซฟิลด์สเกลาร์และปัญหาความไม่แปรเปลี่ยนของลอเรนซ์

ซึ่งถูกต้องจริง ฉันยังพยายาม

var data = (new WebClient()).DownloadData("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20");
var text = System.Text.UTF8Encoding.Default.GetString(data);

แต่สิ่งนี้ทำให้เกิดปัญหาเดียวกัน

ฉันไม่แน่ใจว่าความผิดอยู่ที่นี่ ฟีดโกหกเกี่ยวกับการเข้ารหัส UTF8 หรือไม่และเบราว์เซอร์ฉลาดพอที่จะคิดออก แต่ไม่WebClient? ฟีดมีการเข้ารหัส UTF8 อย่างถูกต้อง แต่WebClientล้มเหลวด้วยวิธีอื่นหรือไม่ ฉันจะทำอย่างไรเพื่อลดปัญหานี้


6
UTF8Encoding.Defaultเป็นจริงEncoding.Defaultซึ่งเป็นการเข้ารหัส ANSI ตามการตั้งค่าภาษา OS
svick

คำตอบ:


205

มันไม่ได้โกหก คุณควรตั้งค่าการเข้ารหัสของ webclient ก่อนที่จะเรียก DownloadString

using(WebClient webClient = new WebClient())
{
webClient.Encoding = Encoding.UTF8;
string s = webClient.DownloadString("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20");
}

สาเหตุที่ทางเลือกของคุณไม่ทำงานนั้นเป็นเพราะการใช้งานไม่ถูกต้อง ควรเป็น:

System.Text.Encoding.UTF8.GetString()

9
ยอดเยี่ยมขอบคุณ! แปลกที่WebClientไม่ใช้ส่วนหัวในการตรวจจับสิ่งนี้ แต่มันทำงานได้อย่างสมบูรณ์แบบและระหว่างคุณกับ @svick ฉันเข้าใจว่าทำไมสิ่งอื่นที่ฉันลองถึงล้มเหลวอย่างน่าสังเวชเช่นกัน
Domenic

1
ใช้ได้ผลUploadStringเช่นกัน
irfandar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.