Hướng dẫn special characters showing up as question marks in php - các ký tự đặc biệt hiển thị dưới dạng dấu chấm hỏi trong php

Bộ ký tự mặc định PHP là UTF-8. Tất cả các ký tự đặc biệt trong PHP và HTML đều xuất hiện dưới dạng câu hỏi như "?" trong trình duyệt. Tất cả dữ liệu với các ký tự đặc biệt được lưu trữ dưới dạng UTF-8 trong các trường cơ sở dữ liệu. Nhưng khi PHP đọc cơ sở dữ liệu và đầu ra cho các trình duyệt, tất cả các ký tự đặc biệt như ký hiệu bản quyền và nhãn hiệu là?

Dữ liệu không thể được mã hóa dưới dạng HTMLENTITY, bởi vì nếu không thì dữ liệu sẽ được xuất trong trình duyệt dưới dạng mã HTML. Các trường trong cơ sở dữ liệu có đánh dấu HTML. Nó giống như một lĩnh vực wysiwyg.

Câu hỏi tương tự khác không thực sự giải quyết vấn đề. Vấn đề của tôi là PHP đang đọc một trường cơ sở dữ liệu được mã hóa trong UTF-8 bao gồm đánh dấu HTML, văn bản và ký tự đặc biệt. Sau đó lưu dữ liệu trong trường cơ sở dữ liệu được mã hóa UTF-8 khác. Nhưng một cái gì đó ở giữa không đúng. Sau khi quá trình được thực hiện, các ký tự đặc biệt trong các cột MySQL mới là?. Vì vậy, trình duyệt đang hiển thị? cho tất cả các ký tự đặc biệt.

$conn = new mysqli($host, $username, $password, $dbName);
mysql_set_charset('utf-8',$conn);


$categoryDescription = utf8_encode(utf8_decode($var['manufacturer_overview']));

Tôi không chắc trang web của bạn là gì, nhưng theo câu trả lời trên, anh ấy tuyên bố bộ ký tự được sử dụng cho dữ liệu trang web khác với UTF-8, nhưng tôi có câu trả lời có thể giúp bạn.

Bạn sẽ cần tạo một số loại tập lệnh máy chủ thực sự có thể xử lý dữ liệu trong bộ ký tự gốc. Những gì bạn có là đây ....


... Đó là ok, nhưng chúng ta có thể làm tốt hơn. Tập lệnh PHP sau đây sẽ hoạt động cho bạn.


Lưu tệp trên với bất kỳ tên nào với tiện ích mở rộng .php. Hãy gọi nó là Decode.php. Bây giờ đặt mã mà bạn yêu cầu tạo ra các dấu hỏi thay vì các dấu hiệu trong cùng một thư mục. Hãy gọi nó là Marks.htm

Sau đó, trong thanh địa chỉ của bạn, bạn đi đến một cái gì đó như:

http://example.com/decode.php?html=marks.htm&charset=ISO-8859-1

Điều đó sẽ khiến tiêu đề ISO-8859-1 được nhận và HTML in ra ở định dạng thích hợp.

Mã của tôi hiện không kiểm tra lỗi vì tôi đã viết nhanh, nhưng tốt hơn hết là bạn nên chỉ định mã hóa trong các tiêu đề HTTP hơn là thẻ meta HTML, đặc biệt là nếu thẻ meta đó yêu cầu đọc giải mã.

Tôi có thiết lập Drupal 8 (8.2.5) trên máy chủ Jessie Debian PHP 7.0.15-1~dotdeb+8.1 và MySQL 5.5.54. Tất cả một Drupal đột ngột đã chuyển đổi tất cả các nhân vật đặc biệt như ü,ä,ö,ß,–... thành các dấu hỏi như Das mu?? doch nicht sein.

Lúc đầu tôi nghĩ, đây phải là một vấn đề với mã hóa sai trong tiêu đề HTML, nhưng mã hóa của trang là: UTF-8. Sau đó, tôi nhận ra rằng, trong cơ sở dữ liệu, tất cả các ký tự đó thực sự được 'chuyển đổi' thành các dấu hỏi. Như tôi có trên cùng một máy chủ, nhiều trường hợp Drupal (câu 6, 7 và 8) đang chạy, điều chưa bao giờ thể hiện hành vi như vậy, tôi không nghĩ, đó là một vấn đề với thiết lập máy chủ. Nhật ký MySQL không hiển thị bất cứ điều gì đề cập đến vấn đề này.

Sau khi khôi phục cơ sở dữ liệu, vấn đề tương tự lại xảy ra sau một số ngày.

Tôi hoàn toàn không có manh mối, những gì đang xảy ra. Có ai có ý tưởng gì có thể là nguyên nhân của vấn đề này không?

CẬP NHẬT: Vấn đề này đang trở nên có dây hơn: hóa ra, ngay khi tôi xóa bộ đệm, tất cả các ký tự đặc biệt đã biến mất. Một cái nhìn vào cơ sở dữ liệu (với phpmyadmin) cho thấy, chúng thực sự là như vậy. Khi tôi khôi phục lại một phiên bản cơ sở dữ liệu cũ, tất cả các ký tự đặc biệt được hiển thị chính xác trên trang web, nhưng trong cơ sở dữ liệu, chúng vẫn được hiển thị dưới dạng dấu hỏi. Dự đoán đầu tiên của tôi là: Chúng đã được chuyển đổi «trong cơ sở dữ liệu mà tôi đang sử dụng, nhưng chỉ đúng trong bảng bộ đệm. Nhưng, khi khôi phục cơ sở dữ liệu và chỉnh sửa trực tiếp một nút bị ảnh hưởng, tất cả các ký tự đặc biệt được hiển thị chính xác trong trường biểu mẫu. Sau khi lưu nó, chúng là chính xác ngay cả trong cơ sở dữ liệu. Vì vậy, tôi có thể khôi phục tất cả các ký tự đặc biệt bằng cách xuất bản số lượng lớn chúng từ giao diện /admin/content. Ngoài ra, nó chỉ ra rằng không chỉ nhân vật đặc biệt trong các trường nút đã biến mất, mà còn trong các bí danh và các thuật ngữ phân loại. Ví dụ: trong đó »ä« nên được chuyển đổi thành »ae« trong một bí danh đường dẫn, nó đã được chuyển sang một »?«.

Hãy để tôi chứng minh điều này với một số ảnh chụp màn hình. Nhân vật đặc biệt trong trường hợp này là một dấu gạch ngang ( -): Đây là cách nó trông giống như trên trang web, khi vấn đề xảy ra, một dấu hỏi được hiển thị ban đầu một dấu gạch ngang là:

Hướng dẫn special characters showing up as question marks in php - các ký tự đặc biệt hiển thị dưới dạng dấu chấm hỏi trong php

PHPMyAdmin cho chúng ta thấy trong bức ảnh tiếp theo, rằng en Dash này đã thực sự được chuyển đổi thành một dấu hỏi:

Hướng dẫn special characters showing up as question marks in php - các ký tự đặc biệt hiển thị dưới dạng dấu chấm hỏi trong php

Nhìn vào bản sao lưu của cơ sở dữ liệu của tôi với một trình soạn thảo văn bản cho thấy, trong đó các ký tự đặc biệt không bị hỏng.

Hướng dẫn special characters showing up as question marks in php - các ký tự đặc biệt hiển thị dưới dạng dấu chấm hỏi trong php

Tải lên tệp cơ sở dữ liệu với mackup và di chuyển hoặc với drush sql-cli < path/to/my/file/database.sql nhìn vào cơ sở dữ liệu hiển thị, nó sẽ bị hỏng ngay lập tức:

Hướng dẫn special characters showing up as question marks in php - các ký tự đặc biệt hiển thị dưới dạng dấu chấm hỏi trong php

Nhưng trên trang web miễn là tôi không xóa bộ đệm đều có vẻ tốt. Điều đó có nghĩa là bảng bộ đệm không bị hỏng. Nhưng đáng ngạc nhiên ngay cả khi tôi chỉnh sửa một nút, nó được hiển thị như thể nó không bị hỏng:the cache table aren't corrupted. But surprisingly even if I edit an node, it is shown as if it weren't corrupted:

Hướng dẫn special characters showing up as question marks in php - các ký tự đặc biệt hiển thị dưới dạng dấu chấm hỏi trong php

Đối với một thường dân như tôi dẫn đến kết luận:

  • Một số làm thế nào, nếu tôi chỉnh sửa một nút, nội dung của nó được tải từ các bảng bộ đệm!

Vì vậy, câu hỏi của tôi là:

  1. Mô -đun hoặc chức năng Drupal nào có thể chịu trách nhiệm chạm vào tất cả mọi mục nhập cơ sở dữ liệu, nhưng không phải là bảng bộ đệm?
  2. Nếu tôi lưu lại một nút hoặc thực thể (mà không thực hiện bất kỳ thay đổi nào), làm thế nào là có thể, việc nhập cơ sở dữ liệu của các trường bị ảnh hưởng thay đổi?

Làm cách nào để cho phép các ký tự đặc biệt trong PHP?

Mẹo: Để chuyển đổi các thực thể HTML đặc biệt trở lại các ký tự, hãy sử dụng hàm htmlspecialchars_decode () ...
& (ampersand) trở thành & amp ;.
"(trích dẫn kép) trở thành & quot ;.
'(Trích dẫn đơn) trở thành ' ;.
< (less than) becomes <.
> (lớn hơn) trở thành & gt ;.

HTMLSpecialchars là gì?

The htmlspecialchars() function is used to converts special characters ( e.g. & (ampersand), " (double quote), ' (single quote), < (less than), > (greater than)) to HTML entities ( i.e. & (ampersand) becomes &, ' (single quote) becomes ', < (less than) becomes < (greater than) becomes > ).