2009-09-28 32 views
13

Tôi có biểu mẫu HTML và một số người dùng đang sao chép/dán văn bản từ MS Word. Khi có dấu nháy đơn hoặc dấu ngoặc kép, họ nhận được dịch sang nhân vật hài hước như:Tại sao dấu ngoặc kép biến thành ký tự hài hước khi được gửi dưới dạng HTML?

'Â € Â ™ và Ã ¢ Â € Â ™

Cột cơ sở dữ liệu là đối chiếu utf8_general_ci.

Làm cách nào để có các ký tự thích hợp hiển thị?

Chỉnh sửa: Sự cố được giải quyết. Dưới đây là cách tôi đã khắc phục sự cố:

Ran mysql_query("SET NAMES 'utf8'"); trước khi thêm/truy xuất lại từ cơ sở dữ liệu. (nhờ bình luận của Donal bên dưới).

Và có phần lẻ, hàm php urlencode($text) được áp dụng khi hiển thị, do đó phải được xóa.

Tôi cũng đảm bảo rằng tiêu đề cho trang và yêu cầu/phản hồi ajax đều là utf8.

+4

MS Word thay đổi dấu ngoặc kép thành "dấu ngoặc kép thông minh", bất kỳ điều gì ngoài thông minh. Họ sử dụng "trang mã" của Microsoft thay vì Unicode. –

+0

Bạn sẽ nhận thấy điều này với một số dấu gạch ngang quá. – Buggabill

+1

Nếu tất cả các mã hóa được chỉ định chính xác, các mã hóa này sẽ được tự động chuyển đổi thành Unicode tương đương. Tôi nghi ngờ vấn đề là cụ thể đối với Word; thử gõ ví dụ Alt + 130 (é) trực tiếp, và xem nó đi qua sạch sẽ. – Thomas

Trả lời

21

này trông giống như một trường hợp điển hình của unicode (UTF-8 rất có thể) nhân vật được hiểu là iso-8859-1. Có một vài nơi dọc theo cách mà các nhân vật có thể bị hỏng. Đầu tiên, trình duyệt của khách hàng phải gửi dữ liệu. Nó có thể làm hỏng dữ liệu nếu nó không thể chuyển đổi các ký tự chính xác sang mã hóa ký tự của trang. Sau đó, máy chủ đọc dữ liệu và giải mã các byte thành các ký tự. Nếu máy khách và máy chủ không đồng ý về mã hóa được sử dụng thì các ký tự sẽ bị hỏng. Sau đó, dữ liệu được lưu trữ trong cơ sở dữ liệu; một lần nữa có tiềm năng tham nhũng. Cuối cùng, khi dữ liệu được ghi trên trang (để hiển thị cho trình duyệt), trình duyệt có thể hiểu sai các byte nếu trang không biểu thị đầy đủ mã hóa của nó.

Bạn cần đảm bảo rằng bạn đang sử dụng UTF-8 trong suốt. Giá trị mặc định cho các trang web là iso-8859-1, vì vậy trang web của bạn sẽ được phục vụ với tiêu đề Content-Type hoặc thẻ meta

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

(chắc chắn rằng bạn thực sự đang chấp hành văn bản trong mã hóa đó).

Bằng cách sử dụng UTF-8 cùng với tất cả các phần của quy trình, bạn sẽ tránh được sự cố với tất cả các trình duyệt web và cơ sở dữ liệu đang hoạt động.

+1

+1, không có địa phương sửa chữa cho những vấn đề này, điều quan trọng là tư duy được mã hóa nhận thức bất cứ nơi nào bạn đang truyền hoặc lưu trữ văn bản. –

+0

Có Tôi đồng ý với @ user8599 .... – omega

5

Kiểm tra mã hóa mà trang sử dụng. Mã hóa nó bằng cách sử dụng UTF-8 và thêm thẻ meta mô tả mã hóa:

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

Chúng tôi có chức năng PHP cố gắng dọn sạch mớ hỗn độn bằng dấu ngoặc kép thông minh. Đó là một chút của một mớ hỗn độn, vì nó phát triển một chút hữu cơ như các trường hợp xuất hiện trong quá trình phát triển mẫu thử nghiệm. Nó có thể giúp đỡ một số, mặc dù:

function convert_smart_quotes($string) { 
    $search = array(chr(0xe2) . chr(0x80) . chr(0x98), 
        chr(0xe2) . chr(0x80) . chr(0x99), 
        chr(0xe2) . chr(0x80) . chr(0x9c), 
        chr(0xe2) . chr(0x80) . chr(0x9d), 
        chr(0xe2) . chr(0x80) . chr(0x93), 
        chr(0xe2) . chr(0x80) . chr(0x94), 
        chr(226) . chr(128) . chr(153), 
        '’','“','â€<9d>','â€"',' '); 

    $replace = array("'","'",'"','"',' - ',' - ',"'","'",'"','"',' - ',' '); 

    return str_replace($search, $replace, $string); 
} 
+4

Tôi đã tự làm điều này, nhưng tôi nghĩ đó là một ý tưởng tồi. Nếu bạn có một quá trình văn bản hoặc bất kỳ loại quy trình nào khác làm hỏng dữ liệu của bạn, hãy khắc phục quy trình để nó không làm hỏng dữ liệu, không chỉ thực hiện chỉnh sửa từng phần cho đầu ra. –

+0

Có - nửa thập kỷ sau. Tôi tình cờ hiểu điều này khi tôi đang duy trì mã hiện tại. Tôi biết về các vấn đề cắt/dán từ các chương trình như Word, nhưng để sao lưu @ mike-a trên đó, đôi khi bạn không thể kiểm soát nguồn thông tin và bạn phải thực hiện một cách tiếp cận bình thường hóa luồng dữ liệu của mình. Tôi đã sử dụng cái này và thêm một cái nữa cho “đạn đầu tiên mà tôi có”. –

Các vấn đề liên quan