2009-09-21 17 views
10

Chúng tôi có trang web sử dụng ASP cổ điển.Thay thế văn bản ASP cổ điển và mã hóa UTF-8

Một phần của quá trình phát hành của chúng tôi thay thế giá trị trong tệp và chúng tôi đã tìm thấy lỗi trong đó tệp sẽ ghi tệp ra dưới dạng UTF-8.

Điều này sau đó khiến ứng dụng của chúng tôi bắt đầu phun rác ra. Các dấu nháy đơn được trả lại dưới dạng một số ký tự được mã hóa.

Nếu sau đó chúng tôi xóa một BOM cho biết tệp này là UTF-8 thì văn bản trước đó được hiển thị dưới dạng thùng rác hiện được hiển thị chính xác.

Có điều gì đó mà IIS thực hiện khác khi nó gặp UTF-8 một tệp không?

+0

Nếu loại bỏ các BOM UTF-8 gây ra các trang hiển thị chính xác sau đó nội dung không phải là UTF-8 chắc chắn? – AnthonyWJones

Trả lời

6

UTF-8 không sử dụng BOM; nó là một sự phản ứng khó chịu trong một số phần mềm của Microsoft đặt chúng ở đó. Bạn cần phải tìm bước nào trong quá trình phát hành của bạn là đặt BOM được mã hóa UTF-8 vào tệp của bạn và sửa nó - bạn nên dừng ngay cả khi bạn sử dụng UTF-8, thực sự là những ngày này là tốt nhất.

Nhưng tôi nghi ngờ đó là IIS gây ra sự cố hiển thị. Nhiều khả năng trình duyệt đoán bộ mã của trang được hiển thị cuối cùng và khi nó thấy các byte trông giống như mã UTF-8 được mã hóa, nó đoán toàn bộ trang là UTF-8. Bạn sẽ có thể để ngăn chặn nó làm điều đó bằng cách nói một charset dứt khoát bằng cách sử dụng một tiêu đề HTTP:

Content-Type: text/html;charset=iso-8859-1 

và/hoặc một yếu tố meta trong HTML

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> 

Bây giờ (giả định tiêu chuẩn ISO-8859- 1 thực sự là ký tự đặt dữ liệu của bạn đang ở trong) nó sẽ hiển thị OK. Tuy nhiên, nếu tệp của bạn thực sự có BOM được mã hóa UTF-8 lúc bắt đầu, bây giờ bạn sẽ thấy rằng dưới dạng ‘ï» ¿’trong trang của bạn, đó là những gì các byte trông giống như trong ISO-8859-1. Vì vậy, bạn vẫn cần phải thoát khỏi misBOM đó.

+0

Điều này có ý nghĩa. Nó thực sự là một lỗi trong một số mã được viết đặc biệt để xử lý loại vấn đề này. Cảm ơn. –

+1

Tôi phải thừa nhận câu trả lời này làm tôi bối rối."UTF-8 không sử dụng BOM", bạn có thể phấn khởi không? Bằng cách nào đây là "sự phản ứng"? Tôi chưa bao giờ gặp phải vấn đề khi sử dụng các tệp UTF-8 bao gồm ký tự khoảng trắng này, bạn gặp phải vấn đề gì? – AnthonyWJones

+0

Bất kỳ công cụ văn bản dựa trên byte nào (chẳng hạn như các trình bao, trình tải tệp cấu hình, v.v.) sẽ ngay lập tức đổ xuống khi được trình bày bằng “ï» ¿”ở đầu tệp; nó là mục đích rõ ràng của UTF-8 để tương thích với các công cụ không biết gì về Unicode, nhưng UTF-8 + BOM phá vỡ điều này. Ngay cả một số công cụ nhận thức Unicode sẽ đi qua nó vì một BOM chỉ được dự kiến ​​là có mặt và được tự động loại bỏ bởi quá trình giải mã Unicode cho UTF-16. UTF-8 + BOM phá vỡ các ứng dụng và không có lý do nào để sử dụng nó trong các thông số kỹ thuật Unicode; và thậm chí không có bất kỳ lợi ích nào vì UTF-8 không có vấn đề về thứ tự byte. – bobince

13

Tôi đã tìm kiếm về vấn đề chính xác cùng ngày hôm qua và đã xem qua:

http://blog.inspired.no/utf-8-with-asp-71/

phần quan trọng từ trang đó, trong trường hợp nó sẽ biến mất ...

ASP Mã sản phẩm:

Response.ContentType = "text/html" 
Response.AddHeader "Content-Type", "text/html;charset=UTF-8" 
Response.CodePage = 65001 
Response.CharSet = "UTF-8" 

và thẻ META HTML sau:

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 

Chúng tôi đã sử dụng thẻ meta và thuộc tính asp CharSet, nhưng trang vẫn không hiển thị chính xác. Sau khi thêm ba dòng khác vào tập tin asp tất cả mọi thứ chỉ làm việc.

Hy vọng điều này sẽ hữu ích!

+1

Bạn không cần cả thẻ meta và 'Response.CharSet =" UTF-8 "vì cả hai đều phục vụ cùng một mục đích, cá nhân tôi thích sử dụng' Response.CharSet = "UTF-8" 'thay vì đặt rõ ràng nó như một thẻ meta trong [tag: HTML]. Ngoài ra 'Response.AddHeader" Content-Type "," text/html; charset = UTF-8 "' chỉ là một hình thức rõ ràng của văn bản 'Response.ContentType =" text/html "' và 'Response.CharSet =" UTF- 8 "' những gì bạn đang đề xuất là vô nghĩa, gắn bó với việc sử dụng 'Response.ContentType' và' Response.CharSet'. – Lankymart

+0

Rất hepfull @Werewolf thx u cho những đóng góp của bạn .. – Artemination

+0

Bạn tiết kiệm cuộc sống của tôi :) – kyawagwin

2

Nếu bạn sử dụng truy cập db bạn nên viết

Session.CodePage=65001 
Set tabtable= Conn.Execute("SELECT * FROM table") 
Các vấn đề liên quan