Các vấn đề về mã hóa HTML - Nhân vật của Tiếng Ân hiển thị thay vì & &;


203

Tôi đã có một ứng dụng cũ chỉ bắt đầu hoạt động sai, vì bất kỳ lý do gì tôi không chắc chắn. Nó tạo ra một loạt các HTML được ActivePDF chuyển thành các báo cáo PDF.

Quá trình hoạt động như thế này:

  1. Kéo một mẫu HTML từ DB có mã thông báo được thay thế (ví dụ: "~ CompanyName ~", "~ CustomerName ~", v.v.)
  2. Thay thế các mã thông báo bằng dữ liệu thực
  3. Dọn dẹp HTML bằng một hàm regex đơn giản có định dạng các giá trị thuộc tính thẻ HTML (đảm bảo dấu ngoặc kép, v.v., vì công cụ kết xuất của ActivePDF ghét bất cứ thứ gì trừ các dấu ngoặc đơn xung quanh các giá trị thuộc tính)
  4. Gửi HTML đến một dịch vụ web tạo PDF.

Ở đâu đó trong mớ hỗn độn đó, các không gian không phá vỡ từ mẫu HTML (   ) được mã hóa thành ISO-8859-1 để chúng hiển thị không chính xác dưới dạng ký tự "Â" khi xem tài liệu trong trình duyệt (FireFox). ActivePDF tạo ra các ký tự không phải UTF8.

Câu hỏi của tôi: vì tôi không biết vấn đề bắt nguồn từ đâu và không có thời gian để điều tra vấn đề, có cách nào dễ dàng để mã hóa lại hoặc tìm và thay thế các ký tự xấu không? Tôi đã thử gửi nó thông qua chức năng nhỏ này mà tôi đã ném cùng nhau, nhưng nó biến tất cả thành gobbledegook không thay đổi gì cả.

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

Có ý kiến ​​gì không?

BIÊN TẬP:

Bây giờ tôi đang nhận được điều này, mặc dù nó dường như không phải là một giải pháp tốt:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function

2
HTML có chứa bất kỳ thông tin meta nào để mô tả bộ ký tự của nó không?
Rowland Shaw

1
[Nhận xét trước đã xóa] Câu trả lời ngắn: không.
Cᴏʀʏ

1
Đối với tôi đã làm việc: utf8_decode ()
ursuleacv

Câu trả lời:


339

Ở đâu đó trong mớ hỗn độn đó, các khoảng trắng không phá vỡ từ (các) mẫu HTML được mã hóa thành ISO-8859-1 để chúng hiển thị không chính xác dưới dạng ký tự "Â"

Đó sẽ là mã hóa thành UTF-8, không phải ISO-8859-1. Ký tự không gian không phá vỡ là byte 0xA0 trong ISO-8859-1; khi được mã hóa thành UTF-8, nó sẽ là 0xC2,0xA0, nếu bạn (không chính xác) xem nó là ISO-8859-1 xuất hiện dưới dạng " ". Điều đó bao gồm một dấu vết mà bạn có thể không nhận thấy; nếu byte đó không có ở đó, thì một cái gì đó khác đã đánh cắp tài liệu của bạn và chúng ta cần xem thêm để tìm hiểu cái gì.

Chế độ regrec là gì, templating hoạt động như thế nào? Dường như có một trình phân tích cú pháp HTML thích hợp có liên quan ở đâu đó nếu  chuỗi (chính xác) được chuyển thành các ký tự KHÔNG GIAN KHÔNG NỀN TẢNG U + 00A0. Nếu vậy, bạn chỉ có thể xử lý mẫu của mình một cách tự nhiên trong DOM và yêu cầu nó tuần tự hóa bằng cách sử dụng mã hóa ASCII để giữ các ký tự không phải ASCII làm tham chiếu ký tự. Điều đó cũng sẽ ngăn bạn phải xử lý hậu kỳ regex trên chính HTML, đây luôn là một công việc rất khó khăn.

Dù sao thì, bây giờ bạn có thể thêm một trong những điều sau vào tài liệu của mình <head>và xem liệu điều đó có khiến nó trông đúng trong trình duyệt không:

  • cho HTML4: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • cho HTML5: <meta charset="utf-8">

Nếu bạn đã làm điều đó, thì mọi vấn đề còn lại là lỗi của ActivePDF.


20
Tôi sẽ không đề nghị <meta charset="utf-8">nào. Các http-equivphiên bản vẫn còn hiệu lực trong HTML5 và được tốt hơn hỗ trợ.
bobince

8
Câu trả lời từ cái nào sẽ sử dụng: <meta charset = 'utf-8'> so với <meta http-Equiv = 'Kiểu nội dung' rằng phiên bản ngắn được hỗ trợ tốt.
Richard Ayotte


Nó hoạt động trong tất cả các trình duyệt hiện đại . Nó chắc chắn không hoạt động trong tất cả các trình duyệt kế thừa và thích hợp (ví dụ như điện thoại di động) hoặc trên tất cả các trình thu thập dữ liệu.
bobince

3
"Một nơi nào đó trong mớ hỗn độn đó" ... LOL! Đẹp mở! Câu trả lời tốt! +1
Chống lại thiết kế

24

Nếu bất kỳ ai có cùng một vấn đề như tôi và bộ ký tự đã chính xác, chỉ cần làm điều này:

  1. Sao chép tất cả mã bên trong tệp .html.
  2. Mở notepad (hoặc bất kỳ trình soạn thảo văn bản cơ bản nào) và dán mã.
  3. Chuyển đến "Tệp -> Lưu dưới dạng"
  4. Nhập tên tệp của bạn "example.html" (Chọn "Lưu dưới dạng: Tất cả tệp ( . )")
  5. Chọn Mã hóa là UTF-8
  6. Nhấn Save và bây giờ bạn có thể xóa tệp .html cũ của mình và mã hóa phải được sửa

2
Điều này đã làm điều đó cho tôi. Bây giờ trong cao siêu nó nói UTF-8 with BOMthay vì UTF-8. Để thấy điều này trong văn bản cao siêu, bạn cần show_encodingđặt thành trueCài đặt - Người dùng.
J86

Tôi gặp vấn đề hiển thị Â thay vì », amd Khi sử dụng giải pháp này, vấn đề đã được giải quyết nhưng có một cảnh báo php: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152
SCC

Giải pháp này đã làm việc cho tôi. Tôi đã làm việc trong notepad ++ và khi tôi lưu nó trong notepad cơ bản là UTF-8, sau khi mở tệp mới trong notepad ++, mã hóa được đặt thành UTF-8-BOM (tôi không chắc là gì). Dù sao, đó dường như là vấn đề đối với tôi.
BoltKey

Cảm ơn bạn! Điều này đã lừa Tôi thấy trong yêu cầu / phản hồi tệp (trong trường hợp của tôi, ASPX) đã được mã hóa thành UTF-8. Notepad ++ cũng được mã hóa thành UTF-8. Cái quái gì vậy? Nhưng giải pháp của bạn là mẹo. Đối với tôi, đó là một cụm từ tiếng Tây Ban Nha không được mã hóa chính xác trên trang. Tôi đã đọc ở nơi khác không sử dụng UTF-8 BOM cho tiếng Tây Ban Nha nhưng nó đã sửa nó cho tôi.
dùng3621633

13

Vấn đề: Ngay cả khi tôi gặp phải vấn đề chúng tôi đã gửi '£' với một số chuỗi trong yêu cầu POST đến Hệ thống CRM, nhưng khi chúng tôi thực hiện cuộc gọi GET từ CRM, nó đã trả về 'Â £' với một số nội dung chuỗi. Vì vậy, những gì chúng tôi đã phân tích là '£' đã được chuyển đổi thành 'Â £' .

Phân tích: Sự cố mà chúng tôi đã tìm thấy sau khi thực hiện nghiên cứu là trong cuộc gọi POST, chúng tôi đã đặt HTTPWebRequest ContentType là "text / xml" trong khi trong GET Gọi đó là "text / xml; charset: utf-8" .

Giải pháp: Vì vậy, là một phần của giải pháp, chúng tôi đã bao gồm bộ ký tự: utf-8 trong yêu cầu POST và nó hoạt động.


0

Trong trường hợp của tôi, điều này (một dấu mũ) xảy ra trong mã tôi đã tạo từ studio trực quan bằng công cụ của riêng tôi để tạo mã. Thật dễ dàng để giải quyết:

Chọn khoảng trắng đơn () trong tài liệu. Bạn sẽ có thể thấy nhiều không gian đơn lẻ trông khác với các không gian đơn khác, chúng không được chọn. Chọn các không gian đơn khác này - chúng là những người chịu trách nhiệm cho các ký tự không mong muốn trong trình duyệt. Chuyển đến Tìm và Thay thế bằng dấu cách đơn (). Làm xong.

PS: Dễ dàng hơn để xem tất cả các ký tự tương tự khi bạn đặt con trỏ trên một hoặc nếu bạn chọn nó trong VS2017 +; Tôi hy vọng các IDE khác có thể có các tính năng tương tự


-1

Trong trường hợp của tôi, tôi đã nhận được dấu chéo Latin thay vì nbsp, ngay cả khi một trang được mã hóa chính xác vào UTF-8. Không có gì ở trên giúp giải quyết vấn đề và tôi đã thử tất cả.

Cuối cùng, việc thay đổi phông chữ cho IE (với css dành riêng cho trình duyệt), tôi đã sử dụng Helvetica-Nue làm phông chữ cơ thể thay đổi thành Arial đã giải quyết vấn đề.


Lý do tại sao việc chuyển đổi phông chữ có thể có ích là vì một trong những phông chữ không chứa ký tự được đề cập, vì vậy, những gì bạn thấy là một ký tự trống, thay vào đó. Nhưng điều này không giải quyết được vấn đề, nó chỉ che đậy nó.
Oliver Hausler

-2

Tôi đã có cùng một loại vấn đề. Rõ ràng đó đơn giản là vì PHP không nhận ra utf-8.

Lúc đầu, tôi đã xé tóc ra khi một dấu '£' tiếp tục hiển thị là 'Â £', mặc dù nó có vẻ ổn trong DreamWeaver. Cuối cùng, tôi nhớ rằng tôi đã gặp vấn đề với các liên kết liên quan đến tệp chỉ mục, khi các trang, nếu được xem trực tiếp sẽ hoạt động với trình chiếu, nhưng không phải khi được sử dụng với một bao gồm (nhưng đó là bên cạnh điểm. Dù sao tôi cũng tự hỏi liệu đây có phải là một vấn đề tương tự, vì vậy thay vì đưa vào trang mà tôi gặp vấn đề, tôi chỉ cần đặt nó vào tệp index.php - vấn đề được khắc phục xuyên suốt.


-2

Lý do cho điều này là PHP không nhận ra utf-8.

Tại đây bạn có thể kiểm tra nó cho tất cả các ký tự đặc biệt trong HTML

http://www.degraeve.com/reference/specialchar character.php


1
Đây không phải là một câu hỏi về PHP, đó là VB.NET.
Cᴏʀʏ

tôi không, nhưng bạn có thể sử dụng những ký tự này để giải quyết vấn đề. Điều này đã cố định giải pháp của tôi.
al123

-2

Vâng, tôi cũng gặp phải vấn đề này trong một vài trang web của mình và tất cả những gì tôi cần làm là tùy chỉnh fetler nội dung cho các mục HTML. trước đó tôi xóa chúng nhiều hơn tôi nhận được, vì vậy chỉ cần thay đổi chức năng phân tích cú pháp html hoặc phân tích cú pháp cho trang và nó đã hoạt động. Nó chủ yếu là do các trình soạn thảo HTML trong hầu hết các CMS. cách họ lưu trữ phân tích dữ liệu gây ra vấn đề này (Trong trường hợp của tôi). Điều này có thể giúp trong trường hợp của bạn quá

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.