UTF-8 suốt chặng đường


1191

Tôi đang thiết lập một máy chủ mới và muốn hỗ trợ UTF-8 đầy đủ trong ứng dụng web của mình. Tôi đã thử điều này trong quá khứ trên các máy chủ hiện có và dường như cuối cùng phải quay lại ISO-8859-1.

Chính xác thì tôi cần đặt mã hóa / bảng mã ở đâu? Tôi biết rằng tôi cần phải định cấu hình Apache, MySQL và PHP để thực hiện việc này - có một số danh sách kiểm tra tiêu chuẩn nào tôi có thể theo dõi hoặc có thể khắc phục sự cố xảy ra sự không phù hợp?

Đây là một máy chủ Linux mới, chạy MySQL 5, PHP, 5 và Apache 2.


8
Dưới đây là tổng quan về tất cả các lỗi mã hóa mà bạn có thể mắc phải: sebastianviereck.de/en/ mẹo
Sebastian Viereck

13
Dưới đây là phần giới thiệu về mã hóa nói chung và mã hóa trong PHP nói riêng: Điều mà mọi lập trình viên hoàn toàn cần, tích cực cần biết về mã hóa và bộ ký tự để làm việc với văn bản
lừa dối

Một số cuộc thảo luận gần đây về PHP 7 chỉ ra rằng không có thay đổi nào ở vị trí "chính thức bị bỏ rơi" năm 2010 ... Có điều gì khác về "PHP7 và UTF-8" không?
Peter Krauss

Vấn đề này là phổ biến. Nhưng không có giải pháp phím tắt nào, bạn sẽ phải thiết lập utf-8riêng cho từng người trong số họ - MySQL 5, PHP 5 HOẶC Apache 2.
Manish Shrivastava

Câu trả lời:


1016

Lưu trữ dữ liệu :

  • Chỉ định bộ utf8mb4ký tự trên tất cả các bảng và cột văn bản trong cơ sở dữ liệu của bạn. Điều này làm cho MySQL lưu trữ và truy xuất các giá trị được mã hóa nguyên bản trong UTF-8. Lưu ý rằng MySQL sẽ ngầm sử dụng utf8mb4mã hóa nếu utf8mb4_*đối chiếu được chỉ định (không có bất kỳ bộ ký tự rõ ràng nào).

  • Trong các phiên bản cũ hơn của MySQL (<5.5.3), bạn sẽ không may bị buộc phải sử dụng một cách đơn giản utf8, chỉ hỗ trợ một tập hợp các ký tự Unicode. Tôi ước tôi đang đùa.

Truy cập dữ liệu :

  • Trong mã ứng dụng của bạn (ví dụ PHP), trong bất kỳ phương thức truy cập DB nào bạn sử dụng, bạn sẽ cần đặt bộ ký tự kết nối thành utf8mb4. Theo cách này, MySQL không chuyển đổi từ UTF-8 gốc của nó khi nó chuyển dữ liệu sang ứng dụng của bạn và ngược lại.

  • Một số trình điều khiển cung cấp cơ chế riêng để định cấu hình bộ ký tự kết nối, cả hai đều cập nhật trạng thái bên trong của chính nó và thông báo cho MySQL về mã hóa được sử dụng trên kết nối, đây thường là cách tiếp cận được ưa thích. Trong PHP:

    • Nếu bạn đang sử dụng lớp trừu tượng PDO với PHP ≥ 5.3.6, bạn có thể chỉ định charsettrong DSN :

      $dbh = new PDO('mysql:charset=utf8mb4');
    • Nếu bạn đang sử dụng mysqli , bạn có thể gọi set_charset():

      $mysqli->set_charset('utf8mb4');       // object oriented style
      mysqli_set_charset($link, 'utf8mb4');  // procedural style
    • Nếu bạn bị mắc kẹt với mysql đơn giản nhưng tình cờ đang chạy PHP ≥ 5.2.3, bạn có thể gọi mysql_set_charset.

  • Nếu trình điều khiển không cung cấp cơ chế riêng để đặt bộ ký tự kết nối, bạn có thể phải đưa ra một truy vấn để cho MySQL biết ứng dụng của bạn mong muốn dữ liệu trên kết nối được mã hóa như thế nào : SET NAMES 'utf8mb4'.

  • Việc xem xét tương tự liên quan đến utf8mb4/ utf8áp dụng như trên.

Đầu ra :

  • Nếu ứng dụng của bạn truyền văn bản đến các hệ thống khác, chúng cũng sẽ cần được thông báo về mã hóa ký tự. Với các ứng dụng web, trình duyệt phải được thông báo về mã hóa trong đó dữ liệu được gửi (thông qua các tiêu đề phản hồi HTTP hoặc siêu dữ liệu HTML ).

  • Trong PHP, bạn có thể sử dụng default_charsettùy chọn php.ini hoặc tự phát hành Content-Typetiêu đề MIME, đây chỉ là công việc nhiều hơn nhưng có tác dụng tương tự.

  • Khi mã hóa đầu ra bằng cách sử dụng json_encode(), thêm JSON_UNESCAPED_UNICODEnhư một tham số thứ hai.

Đầu vào :

  • Thật không may, bạn nên xác minh mọi chuỗi nhận được là UTF-8 hợp lệ trước khi bạn cố lưu trữ hoặc sử dụng nó ở bất cứ đâu. PHP mb_check_encoding()thực hiện mánh khóe, nhưng bạn phải sử dụng nó một cách tôn giáo. Thực sự không có cách nào khác, vì các khách hàng độc hại có thể gửi dữ liệu theo bất kỳ mã hóa nào họ muốn và tôi đã không tìm thấy một mẹo nào để PHP thực hiện điều này cho bạn một cách đáng tin cậy.

  • Từ việc tôi đọc thông số HTML hiện tại , các viên đạn phụ sau đây không còn cần thiết hoặc thậm chí còn hợp lệ nữa đối với HTML hiện đại. Tôi hiểu rằng các trình duyệt sẽ làm việc với và gửi dữ liệu trong bộ ký tự được chỉ định cho tài liệu. Tuy nhiên, nếu bạn đang nhắm mục tiêu các phiên bản HTML cũ hơn (XHTML, HTML4, v.v.), những điểm này vẫn có thể hữu ích:

    • Chỉ dành cho HTML trước HTML5 : bạn muốn tất cả dữ liệu được gửi bởi các trình duyệt ở dạng UTF-8. Thật không may, nếu bạn đi theo cách duy nhất để làm điều này một cách đáng tin cậy thì hãy thêm accept-charsetthuộc tính vào tất cả các <form>thẻ của bạn : <form ... accept-charset="UTF-8">.
    • Chỉ dành cho HTML trước HTML5 : lưu ý rằng thông số HTML W3C nói rằng các máy khách "nên" mặc định gửi các biểu mẫu trở lại máy chủ trong bất kỳ bảng mã nào mà máy chủ phục vụ, nhưng đây rõ ràng chỉ là một khuyến nghị, do đó cần phải rõ ràng trên mọi đơn <form>nhãn.

Các cân nhắc về mã khác :

  • Rõ ràng là đủ, tất cả các tệp bạn sẽ phục vụ (PHP, HTML, JavaScript, v.v.) phải được mã hóa theo UTF-8 hợp lệ.

  • Bạn cần đảm bảo rằng mỗi khi bạn xử lý chuỗi UTF-8, bạn sẽ thực hiện một cách an toàn. Thật không may, đây là phần khó khăn. Có lẽ bạn sẽ muốn sử dụng rộng rãi phần mở rộng của PHP mbstring.

  • Các hoạt động chuỗi tích hợp của PHP không theo mặc định UTF-8 an toàn. Có một số điều bạn có thể thực hiện một cách an toàn với các hoạt động chuỗi PHP bình thường (như nối), nhưng đối với hầu hết mọi thứ bạn nên sử dụng mbstringhàm tương đương .

  • Để biết những gì bạn đang làm (đọc: không làm hỏng nó), bạn thực sự cần biết UTF-8 và cách thức hoạt động ở mức thấp nhất có thể. Kiểm tra bất kỳ liên kết nào từ utf8.com để biết một số tài nguyên tốt để tìm hiểu mọi thứ bạn cần biết.


4
Theo hiểu biết của tôi rằng nếu bạn chỉ định đối chiếu là utf8_ *, thì nó cũng tự động mã hóa thành utf8. Điều này có sai không?
chazomaticus

49
Tôi không sai: THU THẬP ngụ ý CHARACTER SET. Xem ví dụ: dev.mysql.com/doc/refman/5.0/en/charset-database.html .
chazomaticus

7
Xem xét thêm các ví dụ PDO để thiết lập bộ ký tự.
Ja͢ck

97
Lưu ý rằng MySQL không nói cùng ngôn ngữ với mọi người khác. Khi MySQL nói "utf8", nó thực sự có nghĩa là "một số biến thể bị trì hoãn kỳ lạ của UTF-8 bị giới hạn ở ba byte cho chúa biết lý do vô lý". Nếu bạn thực sự muốn UTF-8, bạn nên nói với MySQL rằng bạn muốn điều kỳ lạ này, MySQL thích gọi utf8mb4 . Đừng bận tâm đến việc tiết kiệm trên "WTF!".
R. Martinho Fernandes

4
Câu trả lời này đã giúp tôi rất nhiều NHƯNG tôi cũng thấy rằng trong trường hợp của mình, tôi cần thêm JSON_UNESCAPED_UNICODE vào PHP json_encode của mình khi chuyển kết quả truy vấn DB qua ajax.
Petay87

150

Tôi muốn thêm một điều vào câu trả lời tuyệt vời của chazomaticus :

Đừng quên thẻ META (như thế này hoặc phiên bản HTML4 hoặc XHTML của nó ):

<meta charset="utf-8">

Điều đó có vẻ tầm thường, nhưng IE7 đã cho tôi những vấn đề với điều đó trước đây.

Tôi đã làm mọi thứ đúng; cơ sở dữ liệu, kết nối cơ sở dữ liệu và tiêu đề HTTP Kiểu nội dung đều được đặt thành UTF-8 và nó hoạt động tốt trong tất cả các trình duyệt khác, nhưng Internet Explorer vẫn khăng khăng sử dụng mã hóa "Tây Âu".

Hóa ra trang bị thiếu thẻ META. Thêm vào đó giải quyết vấn đề.

Biên tập:

W3C thực sự có một phần khá lớn dành riêng cho I18N . Họ có một số bài viết liên quan đến vấn đề này - mô tả khía cạnh HTTP, (X) HTML và CSS:

Họ khuyên bạn nên sử dụng cả tiêu đề HTTP và thẻ meta HTML (hoặc khai báo XML trong trường hợp XHTML được phân phát dưới dạng XML).


Không nên cũng có thể chỉ định bộ ký tự trong các tiêu đề HTTP? Có lẽ cần một số tùy chọn cấu hình cho máy chủ web ...
oliver

2
@oliver: Có, bạn có thể gửi nó trong tiêu đề HTTP, nhưng tốt hơn là gửi nó trong nội dung vì nếu máy khách lưu tệp, nó sẽ luôn lưu thẻ meta. Một tiêu đề HTTP có khả năng sẽ biến mất trừ khi trình duyệt đủ thông minh để sao chép nó vào thẻ meta trong tệp đã lưu.

5
Ngoài ra, hãy đảm bảo rằng dòng đó là con đầu tiên của phần tử head (trước bất kỳ nội dung Unicode nào). Trình duyệt có thể diễn giải lại trang sau khi nhấn phần tử meta được mô tả ở trên.
alex

64

Ngoài cài đặt default_charsettrong php.ini, bạn có thể gửi bộ ký tự chính xác bằng cách sử dụng header()từ bên trong mã của mình, trước bất kỳ đầu ra nào:

header('Content-Type: text/html; charset=utf-8');

Làm việc với Unicode trong PHP thật dễ dàng miễn là bạn nhận ra rằng hầu hết các hàm chuỗi không hoạt động với Unicode và một số có thể xâu chuỗi hoàn toàn . PHP coi "ký tự" dài 1 byte. Đôi khi điều này là ổn (ví dụ, explode()chỉ tìm kiếm một chuỗi byte và sử dụng nó như một dấu phân cách - vì vậy nó không quan trọng bạn tìm những ký tự thực tế nào). Nhưng những lần khác, khi hàm thực sự được thiết kế để hoạt động trên các ký tự , PHP không biết rằng văn bản của bạn có các ký tự nhiều byte được tìm thấy bằng Unicode.

Một thư viện tốt để kiểm tra là phputf8 . Điều này viết lại tất cả các hàm "xấu" để bạn có thể làm việc an toàn trên các chuỗi UTF8. Có những phần mở rộng như phần mở rộng mbopes cũng cố gắng làm điều này cho bạn, nhưng tôi thích sử dụng thư viện hơn vì nó dễ mang theo hơn (nhưng tôi viết các sản phẩm đại chúng, vì vậy điều đó rất quan trọng đối với tôi). Nhưng dù sao, phputf8 có thể sử dụng mbopes phía sau hậu trường để tăng hiệu suất.


Đặt cài đặt quá tải trong php.ini. Nó giúp khi sử dụng các chuỗi nhiều byte.
Anthony Rutledge

32

Tôi đã tìm thấy một vấn đề với ai đó sử dụng PDO và câu trả lời là sử dụng điều này cho chuỗi kết nối PDO:

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

Trang web tôi lấy cái này bị sập, nhưng tôi đã có thể lấy nó bằng bộ đệm Google, may mắn thay.


1
Tìm kiếm điều này xa hơn một chút, điều này chỉ cần thiết cho các phiên bản PHP trước 5.3.6. Xem thêm: http://stackoverflow.com/a/4361485/2286722 (mặc dù họ sử dụng riêng $dbh->exec("set names utf8");; tôi thích phương pháp được trình bày ở đây). Btw. cũng có một lưu ý tương tự về điều này như một nhận xét trong hướng dẫn sử dụng PHP: php.net/manual/en/pdo.construct.php#96325 .
Marten Koetsier


24

Trong trường hợp của tôi, tôi đã sử dụng mb_split, trong đó sử dụng regex. Do đó, tôi cũng phải tự đảm bảo mã hóa regex là utf-8 bằng cách thực hiệnmb_regex_encoding('UTF-8');

Một ghi chú bên lề, tôi cũng phát hiện ra bằng cách chạy mb_internal_encoding()rằng mã hóa nội bộ không phải là utf-8 và tôi đã thay đổi điều đó bằng cách chạy mb_internal_encoding("UTF-8");.


22

Trước hết nếu bạn ở trong <5.3PHP thì không. Bạn đã có rất nhiều vấn đề cần giải quyết.

Tôi ngạc nhiên rằng không ai đã đề cập đến thư viện intl , thư viện hỗ trợ tốt cho unicode , đồ thị , hoạt động chuỗi , bản địa hóa và nhiều hơn nữa, xem bên dưới.

Tôi sẽ trích dẫn một số thông tin về hỗ trợ unicode trong PHP bởi các slide của Elizabeth Smith tại PHPBenelux'14

INTL

Tốt

  • Wrapper quanh thư viện ICU
  • Địa phương được chuẩn hóa, đặt ngôn ngữ cho mỗi tập lệnh
  • Định dạng số
  • Định dạng tiền tệ
  • Định dạng tin nhắn (thay thế gettext)
  • Lịch, ngày, múi giờ và thời gian
  • Phiên âm
  • Người giả mạo
  • Gói tài nguyên
  • Bộ chuyển đổi
  • Hỗ trợ IDN
  • Đồ thị
  • Đối chiếu
  • Lặp đi lặp lại

Xấu:

  • Không hỗ trợ zend_multibite
  • Không hỗ trợ chuyển đổi đầu ra đầu vào HTTP
  • Không hỗ trợ quá tải chức năng

mb_ chuỗi

  • Cho phép hỗ trợ zend_multibyte
  • Hỗ trợ mã hóa HTTP vào / ra trong suốt
  • Cung cấp một số hàm bao cho funtionallity, chẳng hạn như strtoupper

ICONV

  • Chính cho chuyển đổi bộ ký tự
  • Xử lý bộ đệm đầu ra
  • chức năng mã hóa mime
  • chuyển đổi
  • một số trình trợ giúp chuỗi (len, đế, strpose, strrpose)
  • Bộ lọc luồng stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')

Cơ sở dữ liệu

  • mysql: Bộ ký tự và đối chiếu trên các bảng và trên kết nối (không phải đối chiếu). Đồng thời không sử dụng mysql - msqli hoặc PDO
  • postgresql: pg_set_client_encoding
  • sqlite (3): Hãy chắc chắn rằng nó được biên dịch với sự hỗ trợ unicode và intl

Một số Gotchas khác

  • Bạn không thể sử dụng tên tệp unicode với PHP và windows trừ khi bạn sử dụng phần mở rộng phần 3.
  • Gửi mọi thứ trong ASCII nếu bạn đang sử dụng exec, Proc_open và các lệnh gọi dòng lệnh khác
  • Văn bản thuần túy không phải là văn bản thuần túy, tập tin có mã hóa
  • Bạn có thể chuyển đổi tập tin nhanh chóng với bộ lọc iconv

Tôi sẽ cập nhật câu trả lời này trong trường hợp mọi thứ thay đổi tính năng được thêm vào và cứ thế.


2
Vâng đúng. Mysqli và PDO có thể sử dụng trình điều khiển riêng của họ. Ngoài ra họ có thể sử dụng trình điều khiển mysqlnd nếu bạn sẽ biên dịch php với --with-mysqli=mysqlnd --with-pdo-mysql=mysqlndcác tùy chọn.
Alexander Yancharuk

14

Điều duy nhất tôi muốn thêm vào những câu trả lời tuyệt vời này là nhấn mạnh vào việc lưu các tệp của bạn trong mã hóa utf8, tôi đã nhận thấy rằng các trình duyệt chấp nhận thuộc tính này qua việc đặt utf8 làm mã hóa mã của bạn. Bất kỳ trình soạn thảo văn bản tử tế nào cũng sẽ cho bạn thấy điều này, ví dụ Notepad ++ có tùy chọn menu để mã hóa tệp, nó hiển thị cho bạn mã hóa hiện tại và cho phép bạn thay đổi nó. Đối với tất cả các tệp php của tôi, tôi sử dụng utf8 mà không cần BOM.

Cách đây không lâu, tôi đã có người nhờ tôi thêm hỗ trợ utf8 cho ứng dụng php / mysql do người khác thiết kế, tôi nhận thấy rằng tất cả các tệp được mã hóa trong ANSI, vì vậy tôi phải sử dụng ICONV để chuyển đổi tất cả các tệp, thay đổi bảng cơ sở dữ liệu để sử dụng utf8 charset và utf8_general_ci collate, thêm 'SET NAMES utf8' vào lớp trừu tượng hóa cơ sở dữ liệu sau khi kết nối (nếu sử dụng 5.3.6 hoặc trước đó, bạn phải sử dụng charset = utf8 trong chuỗi kết nối) và thay đổi các hàm chuỗi để sử dụng đa chuỗi php chuỗi hàm tương đương.


13

Gần đây tôi phát hiện ra rằng việc sử dụng strtolower()có thể gây ra các vấn đề trong đó dữ liệu bị cắt sau một ký tự đặc biệt.

Giải pháp là sử dụng

mb_strtolower($string, 'UTF-8');

mb_ sử dụng MultiByte. Nó hỗ trợ nhiều nhân vật hơn nhưng nói chung là chậm hơn một chút.


9

Tôi vừa trải qua vấn đề tương tự và tìm thấy một giải pháp tốt trong hướng dẫn sử dụng PHP.

Tôi đã thay đổi tất cả mã hóa tệp thành UTF8 rồi mã hóa mặc định trên kết nối của mình. Điều này giải quyết tất cả các vấn đề.

if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
   printf("Current character set: %s\n", $mysqli->character_set_name());
}

Xem nguồn


2
Tôi đã dành một giờ để cố gắng tìm ra một vấn đề mã hóa trên một trang tôi đang làm việc và tôi thường khá giỏi trong việc tìm ra công cụ. Tôi luôn tham khảo trang này và câu trả lời của bạn đã giúp tôi rất nhiều. Có upvote của tôi. Trong trường hợp của tôi, set_charset('utf8mb4')không hoạt động nhưng >set_charset("utf8")đã làm và điều đó thực sự không được hiển thị trong các câu trả lời khác.
Funk Bốn mươi Niner

@FunkFortyNiner Cẩn thận: set_charset("utf8")có thể hoạt động nhưng sẽ hoạt động khác đi (xem các nhận xét về sự khác biệt giữa utf8utf8mb4lịch sử phiên bản mysql). Sử dụng utf8 nếu bạn phải VÀ CHỈ nếu bạn biết bạn đang làm gì !
Martin Hennings

Giải pháp 5 sao, tôi đang đọc một dòng văn bản từng dòng và nhận được? Đối với mỗi nhân vật, sau đó tôi đã lưu - thay vì ansi, sử dụng utf8. cảm ơn.
Atef Farouk

8

Trong PHP, bạn sẽ cần sử dụng các hàm đa nhân hoặc bật mbopes.func_overload . Bằng cách đó, những thứ như strlen sẽ hoạt động nếu bạn có các ký tự chiếm nhiều hơn một byte.

Bạn cũng sẽ cần xác định bộ ký tự phản hồi của bạn. Bạn có thể sử dụng AddDefaultCharset, như trên hoặc viết mã PHP trả về tiêu đề. (Hoặc bạn có thể thêm thẻ META vào tài liệu HTML của mình.)


Mẹo hay về cài đặt func_overload - cho phép sửa đổi tối thiểu thành mã hiện có.
Simon East

4
Hãy cẩn thận - một số mã thực sự có thể dựa vào tính chất một byte cho mỗi ký tự của các hàm chuỗi tiêu chuẩn.
JW.

Điều quan trọng cần lưu ý là tính năng mbopes.func_overload đang bị phản đối kể từ phiên bản 7.2, do các vấn đề được ghi chú trong nhận xét của @ JW ở trên. Vì vậy, lời khuyên tốt nhất là: Có, bạn chắc chắn nên sử dụng các hàm mb chuỗi, nhưng không sử dụng tính năng quá tải để có được các chức năng tiêu chuẩn để hoạt động như đa nhân.
Simba

6

Hỗ trợ Unicode trong PHP vẫn còn là một mớ hỗn độn. Mặc dù nó có khả năng chuyển đổi một chuỗi ISO8859 (mà nó sử dụng bên trong) thành utf8, nhưng nó thiếu khả năng hoạt động với các chuỗi unicode nguyên bản, điều đó có nghĩa là tất cả các hàm xử lý chuỗi sẽ xáo trộn và làm hỏng chuỗi của bạn. Vì vậy, bạn phải sử dụng một thư viện riêng để hỗ trợ utf8 thích hợp hoặc tự viết lại tất cả các hàm xử lý chuỗi.

Phần dễ dàng chỉ là chỉ định bộ ký tự trong các tiêu đề HTTP và trong cơ sở dữ liệu, nhưng không có vấn đề gì nếu mã PHP của bạn không xuất ra UTF8 hợp lệ. Đó là phần khó và PHP hầu như không giúp bạn được gì. (Tôi nghĩ PHP6 có nhiệm vụ khắc phục điều tồi tệ nhất trong số này, nhưng vẫn còn một lúc nữa)


6

Nếu bạn muốn máy chủ MySQL quyết định bộ ký tự chứ không phải PHP với tư cách là máy khách (hành vi cũ; ưu tiên, theo ý kiến ​​của tôi), hãy thử thêm skip-character-set-client-handshakevào my.cnf, bên dưới [mysqld]và khởi động lại mysql.

Điều này có thể gây rắc rối trong trường hợp bạn đang sử dụng bất cứ thứ gì ngoài UTF8.


5

Câu trả lời hàng đầu là tuyệt vời. Đây là những gì tôi đã có trên một thiết lập debian / php / mysql thông thường:

// storage
// debian. apparently already utf-8

// retrieval
// the mysql database was stored in utf-8, 
// but apparently php was requesting iso. this worked: 
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');

// delivery
// php.ini did not have a default charset, 
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');

// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.

// processing
// changed a few commands in php, like substr,
// to mb_substr

đó là tất cả !


1

nếu bạn muốn một giải pháp mysql, tôi đã gặp vấn đề tương tự với 2 dự án của mình, sau khi di chuyển máy chủ. Sau khi tìm kiếm và thử rất nhiều giải pháp, tôi đã tìm ra giải pháp này / không có gì trước khi giải pháp này hoạt động):

mysqli_set_charset($con,"utf8");

Sau khi thêm dòng này vào tập tin cấu hình của tôi, mọi thứ hoạt động tốt!

Tôi đã tìm thấy giải pháp này https://www.w3schools.com/PHP/func_mysqli_set_charset.asp khi tôi đang tìm cách giải quyết một chèn từ truy vấn html

chúc may mắn!


1

Chỉ cần một lưu ý:

Bạn đang phải đối mặt với vấn đề của nhân vật phi Latin của bạn được hiển thị như ?????????, bạn hỏi một câu hỏi, và nó đã khép lại với một tài liệu tham khảo cho câu hỏi kinh điển này, bạn đã cố gắng tất cả mọi thứ và không có vấn đề gì bạn làm, bạn vẫn nhận được ??????????từ MySQL.

Điều đó chủ yếu là do bạn đang kiểm tra dữ liệu cũ đã được chèn vào cơ sở dữ liệu bằng cách sử dụng bộ ký tự sai và được chuyển đổi và lưu trữ thành các ký tự dấu hỏi thực sự ?. Điều đó có nghĩa là bạn đã mất văn bản gốc của mình mãi mãi và bất kể bạn cố gắng gì, bạn sẽ nhận được ???????.

đang áp dụng những gì bạn đã học được từ các câu trả lời của câu hỏi này trên một dữ liệu mới có thể giải quyết vấn đề của bạn.


0

Tôi đã có vấn đề này khi hiển thị bảng. Tôi chỉ đặt điều này trên mỗi biến đầu ra echo:

<td><?php echo utf8_encode ($Local) ?></td>
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.