Tôi tự hỏi làm thế nào tôi có thể giải mã ký tự đặc biệt •
thành HTML?Giải mã ký tự đặc biệt trong C#
Tôi đã thử sử dụng System.Web.HttpUtility.HtmlDecode
nhưng chưa may mắn.
Tôi tự hỏi làm thế nào tôi có thể giải mã ký tự đặc biệt •
thành HTML?Giải mã ký tự đặc biệt trong C#
Tôi đã thử sử dụng System.Web.HttpUtility.HtmlDecode
nhưng chưa may mắn.
HtmlDecode là để chuyển đổi chuỗi được mã hóa Html thành định dạng chuỗi có thể đọc được. Có lẽ HtmlEncode
có thể là những gì bạn đang thực sự tìm kiếm.
Vấn đề ở đây không phải là giải mã HTML, mà đúng hơn là văn bản được mã hóa trong một bộ ký tự (ví dụ: windows-1252) và sau đó được mã hóa lại thành một ký tự thứ hai (UTF-8).
Trong UTF-8, •
được giải mã là E2 80 A2
. Khi chuỗi byte này được đọc bằng cách sử dụng mã hóa windows-1252, E2 80 A2
mã hóa là •
. (Đã lưu lại dưới dạng UTF-8 •
trở thành C3 A2 E2 82 AC C2 A2 20 54 65 73 74
.)
Nếu tệp là tệp được mã hóa cửa sổ-1252, tệp có thể được đọc bằng mã hóa chính xác (ví dụ như đối số cho hàm tạo StreamReader). :
new StreamReader(..., Encoding.GetEncoding("windows-1252"));
Nếu tệp được lưu với mã hóa không đúng, mã hóa có thể được đảo ngược trong một số trường hợp. Ví dụ, đối với trình tự chuỗi trong câu hỏi của bạn, bạn có thể viết:
string s = "•"; // the string sequence that is not properly encoded
var b = Encoding.GetEncoding("windows-1252").GetBytes(s); // b = `E2 80 A2`
string c = Encoding.UTF8.GetString(b); // c = `•`
Lưu ý rằng nhiều nhân vật không in phổ biến là trong phạm vi U+2000
-U+2044
(Reference), chẳng hạn như "dấu ngoặc kép thông minh", đạn, và dấu gạch ngang . Do đó, trình tự â€?
, trong đó ?
là bất kỳ ký tự nào, thường sẽ biểu thị loại lỗi mã hóa này. Điều này cho phép loại hình này lỗi để được sửa chữa một cách rộng rãi hơn:
static string CorrectText(string input)
{
var winencoding = Encoding.GetEncoding("windows-1252");
return Regex.Replace(input, "â€.",
m => Encoding.UTF8.GetString(winencoding.GetBytes(m.Value)));
}
gọi hàm này với các văn bản bị thay đổi theo cách này sẽ sửa một số lỗi (nhưng không phải tất cả). Ví dụ: CorrectText("•Test–or“")
sẽ trả lại mục đích •Test–or“
.
Tôi nghĩ OP muốn xem '•' thay vì 'â € ¢' – Musa
Ah có .. nó nói * ký tự * chứ không phải ký tự. – pcnThird
Làm thế nào để 'dịch' sang '•'? Biểu diễn html của dấu đầu dòng là '•' - hoặc tôi thiếu cái gì? –