Câm â € ™ trực tiếp hiển thị trên trang thay vì


133

’đang hiển thị trên trang của tôi thay vì '.

Tôi có Content-Typecài đặt UTF-8trong cả <head>thẻ và tiêu đề HTTP của mình:

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

nhập mô tả hình ảnh ở đây

Ngoài ra, trình duyệt của tôi được đặt thành Unicode (UTF-8):

nhập mô tả hình ảnh ở đây

Vì vậy, vấn đề là gì, và làm thế nào tôi có thể khắc phục nó?


Câu trả lời:


55

Đảm bảo trình duyệt và trình chỉnh sửa đang sử dụng mã hóa UTF-8 thay vì ISO-8859-1 / Windows-1252.

Hoặc sử dụng &rsquo;.


75
Không, nó không được giải quyết. Vẫn còn sự không nhất quán trong mã hóa ký tự trong ứng dụng của bạn. Bạn sẽ gặp lại vấn đề tương tự trong tương lai đối với các nhân vật không phải CP1252 khác. Và có khá nhiều trong số họ ...
BalusC

12
Ví dụ về các nhân vật mà bạn sẽ tiếp tục gặp phải: i18nqa.com/debug/utf8-debug.html
Zoot

mã hóa utf-8 +1
Karuhanga

217

Vậy vấn đề là gì

Đó là một ký tự ( RIGHT SINGLE QUOTATION MARK- U + 2019) đang được giải mã là CP-1252 thay vì UTF-8 . Nếu bạn kiểm tra mã hóa bảng, sau đó bạn thấy rằng nhân vật này là dưới dạng UTF-8 gồm byte 0xE2, 0x800x99. Nếu bạn đánh dấu vào CP-1252 bố trí trang mã , sau đó bạn sẽ thấy rằng mỗi người trong số những byte đại diện cho những nhân vật cá nhân â, .


và làm thế nào tôi có thể sửa chữa nó?

Sử dụng UTF-8 thay vì CP-1252 để đọc, viết, lưu trữ và hiển thị các ký tự.


Tôi có Loại Nội dung được đặt thành UTF-8 trong cả <head>thẻ và tiêu đề HTTP của tôi:

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

Điều này chỉ hướng dẫn khách hàng sử dụng mã hóa để giải thích và hiển thị các ký tự. Điều này không hướng dẫn chương trình của bạn sử dụng mã hóa để đọc, viết, lưu trữ và hiển thị các ký tự. Câu trả lời chính xác phụ thuộc vào nền tảng / cơ sở dữ liệu / ngôn ngữ lập trình phía máy chủ được sử dụng. Xin lưu ý rằng một bộ trong tiêu đề phản hồi HTTP được ưu tiên hơn thẻ meta HTML. Thẻ meta HTML sẽ chỉ được sử dụng khi trang được mở từ hệ thống tệp đĩa cục bộ thay vì từ HTTP.


Ngoài ra, trình duyệt của tôi được đặt thành Unicode (UTF-8):

Điều này chỉ buộc khách hàng sử dụng mã hóa để giải thích và hiển thị các ký tự. Nhưng vấn đề thực tế là bạn đã gửi ’(được mã hóa bằng UTF-8) cho khách hàng thay vì . Máy khách được hiển thị chính xác ’bằng mã hóa UTF-8. Nếu ứng dụng khách bị cấu trúc sai để sử dụng, ví dụ ISO-8859-1, bạn có thể đã thấy ââ¬â¢thay thế.


Tôi đang sử dụng ASP.NET 2.0 với cơ sở dữ liệu.

Đây rất có thể là vấn đề của bạn nằm. Bạn cần xác minh với một công cụ cơ sở dữ liệu độc lập xem dữ liệu trông như thế nào.

Nếu ký tự ở đó, thì bạn không kết nối đúng với cơ sở dữ liệu. Bạn cần nói với trình kết nối cơ sở dữ liệu để sử dụng UTF-8.

Nếu cơ sở dữ liệu của bạn chứa ’, thì đó là cơ sở dữ liệu của bạn đã bị rối. Hầu hết các bảng không được cấu hình để sử dụng UTF-8. Thay vào đó, họ sử dụng mã hóa mặc định của cơ sở dữ liệu, thay đổi tùy theo cấu hình. Nếu đây là vấn đề của bạn, thì thường chỉ cần thay đổi bảng để sử dụng UTF-8 là đủ. Nếu cơ sở dữ liệu của bạn không hỗ trợ điều đó, bạn sẽ cần tạo lại các bảng. Đó là một thực hành tốt để thiết lập mã hóa của bảng khi bạn tạo nó.

Bạn rất có thể đang sử dụng SQL Server, nhưng đây là một số mã MySQL (được sao chép từ bài viết này ):

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

Tuy nhiên, nếu bảng của bạn đã là UTF-8, thì bạn cần lùi lại một bước. Ai hoặc cái gì đặt dữ liệu ở đó. Đó là vấn đề. Một ví dụ sẽ là các giá trị được gửi dưới dạng HTML được mã hóa / giải mã không chính xác.


Dưới đây là một số liên kết để tìm hiểu thêm về vấn đề:


2
Nếu bạn có nội dung bị hỏng như thế này được lưu ở đâu đó, ví dụ như trong cơ sở dữ liệu mysql, stackoverflow.com/a/9407998/117647 có mẹo bạn cần chuyển đổi các ký tự thành utf-8
Steve

5
TL; DR; Sử dụng UTF-8 để đọc, viết, lưu trữ và hiển thị các ký tự.
c0degeas

Lưu ý rằng các bảng iso-8859-1 và Windows-1252 trùng nhau, do đó một số "tổ hợp ký tự lạ" là chung cho cả hai (ví dụ: "Ã ©" cho "é").
Skippy le Grand Gourou

15

Tôi có một số tài liệu đã được hiển thị …êđang hiển thị như ê. Đây là cách nó đến đó (mã python):

# Adam edits original file using windows-1252
windows = '\x85\xea' 
# that is HORIZONTAL ELLIPSIS, LATIN SMALL LETTER E WITH CIRCUMFLEX

# Beth reads it correctly as windows-1252 and writes it as utf-8
utf8 = windows.decode("windows-1252").encode("utf-8")
print(utf8)

# Charlie reads it *incorrectly* as windows-1252 writes a twingled utf-8 version
twingled = utf8.decode("windows-1252").encode("utf-8")
print(twingled)

# detwingle by reading as utf-8 and writing as windows-1252 (it's really utf-8)
detwingled = twingled.decode("utf-8").encode("windows-1252")

assert utf8==detwingled

Để khắc phục sự cố, tôi đã sử dụng mã python như thế này:

with open("dirty.html","rb") as f:
    dt = f.read()
ct = dt.decode("utf8").encode("windows-1252")
with open("clean.html","wb") as g:
    g.write(ct)

(Vì ai đó đã chèn phiên bản có độ giật vào tài liệu UTF-8 chính xác, tôi thực sự chỉ phải trích xuất phần bị xoắn, làm mờ nó và chèn lại. Tôi đã sử dụng BeautifulSoup cho việc này.)

Nhiều khả năng bạn có Charlie trong việc tạo nội dung so với cấu hình máy chủ web là sai. Bạn cũng có thể buộc trình duyệt web của mình xoắn trang bằng cách chọn mã hóa windows-1252 cho tài liệu utf-8. Trình duyệt web của bạn không thể làm mờ tài liệu mà Charlie đã lưu.

Lưu ý : vấn đề tương tự có thể xảy ra với bất kỳ trang mã byte đơn nào khác (ví dụ: latin-1) thay vì windows-1252.


14

(Mã hóa Unicode U+2019 RIGHT SINGLE QUOTATION MARK) được mã hóa theo UTF-8 dưới dạng byte:

0xE2 0x80 0x99.

’(Mã hóa Unicode U+00E2 U+20AC U+2122) được mã hóa theo UTF-8 dưới dạng byte:

0xC3 0xA2   0xE2 0x82 0xAC   0xE2 0x84 0xA2.

Đây là các byte mà trình duyệt của bạn thực sự nhận được để tạo ra ’khi được xử lý dưới dạng UTF-8.

Điều đó có nghĩa là dữ liệu nguồn của bạn đang trải qua hai lần chuyển đổi bộ ký tự trước khi được gửi tới trình duyệt:

  1. tự nguồn ( U+2019) được mã hóa đầu tiên dưới dạng byte UTF-8:

    0xE2 0x80 0x99

  2. các byte riêng lẻ đó sau đó đã bị hiểu sai và được giải mã thành các bảng mã Unicode U+00E2 U+20AC U+2122bởi một trong các bộ ký tự Windows-125X (1252, 1254, 1256 và 1258 tất cả ánh xạ 0xE2 0x80 0x99tới U+00E2 U+20AC U+2122), và sau đó các bảng mã đó được mã hóa thành các byte UTF-8:

    0xE2-> U+00E2-> 0xC3 0xA2
    0x80-> U+20AC-> 0xE2 0x82 0xAC
    0x99-> U+2122->0xE2 0x84 0xA2

Bạn cần tìm nơi chuyển đổi bổ sung trong bước 2 đang được thực hiện và xóa nó.


12

Điều này đôi khi xảy ra khi một chuỗi được chuyển đổi từ Windows-1252 sang UTF-8 hai lần .

Chúng tôi đã có điều này trong một ứng dụng Zend / PHP / MySQL nơi các ký tự như thế xuất hiện trong cơ sở dữ liệu, có thể là do kết nối MySQL không chỉ định bộ ký tự chính xác. Chúng ta phải:

  1. Đảm bảo Zend và PHP đang liên lạc với cơ sở dữ liệu trong UTF-8 ( không phải theo mặc định)

  2. Sửa chữa các ký tự bị hỏng bằng một số truy vấn SQL như thế này ...

    UPDATE MyTable SET 
    MyField1 = CONVERT(CAST(CONVERT(MyField1 USING latin1) AS BINARY) USING utf8),
    MyField2 = CONVERT(CAST(CONVERT(MyField2 USING latin1) AS BINARY) USING utf8);
    

    Làm điều này cho càng nhiều bảng / cột khi cần thiết.

Bạn cũng có thể sửa một số chuỗi này trong PHP nếu cần. Lưu ý rằng vì các ký tự đã được mã hóa hai lần , chúng tôi thực sự cần thực hiện chuyển đổi ngược từ UTF-8 trở lại Windows-1252, điều này làm tôi bối rối lúc đầu.

mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’

9

Bạn có một sự không phù hợp trong mã hóa ký tự của bạn; chuỗi của bạn được mã hóa trong một mã hóa (UTF-8) và bất cứ điều gì đang diễn giải trang này đang sử dụng một mã khác (giả sử ASCII).

Luôn chỉ định mã hóa của bạn trong các tiêu đề http của bạn và đảm bảo rằng mã này phù hợp với định nghĩa mã hóa của khung của bạn.

Tiêu đề http mẫu:

Content-Type    text/html; charset=utf-8

Cài đặt mã hóa trong asp.net

<configuration>
  <system.web>
    <globalization
      fileEncoding="utf-8"
      requestEncoding="utf-8"
      responseEncoding="utf-8"
      culture="en-US"
      uiCulture="de-DE"
    />
  </system.web>
</configuration>

Đặt mã hóa trong jsp


7

Nếu loại nội dung của bạn đã là UTF8, thì có khả năng dữ liệu đã đến mã hóa sai. Nếu bạn nhận dữ liệu từ cơ sở dữ liệu, hãy đảm bảo kết nối cơ sở dữ liệu sử dụng UTF-8.

Nếu đây là dữ liệu từ một tệp, hãy đảm bảo tệp được mã hóa chính xác dưới dạng UTF-8. Bạn thường có thể đặt điều này trong hộp thoại "Lưu dưới dạng ..." của trình chỉnh sửa bạn chọn.

Nếu dữ liệu đã bị hỏng khi bạn xem nó trong tệp nguồn, rất có thể nó đã từng là tệp UTF-8 nhưng đã được lưu trong mã hóa sai ở đâu đó trên đường đi.


4

Nếu ai đó gặp lỗi này trên trang web WordPress, bạn cần thay đổi bộ ký tự db wp-config:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

thay vì:

define('DB_CHARSET', 'utf8mb4');

0

Trong DBeaver (hoặc các trình soạn thảo khác), tệp script bạn đang làm việc có thể nhắc lưu dưới dạng UTF8 và điều đó sẽ thay đổi char:

â €

vào

–

hoặc là

–

-1

Bạn phải sao chép / dán văn bản từ Tài liệu Word. Tài liệu Word sử dụng Báo giá thông minh. Bạn có thể thay thế nó bằng Ký tự đặc biệt (& rsquo;) hoặc chỉ cần nhập trình soạn thảo HTML (').

Tôi chắc chắn rằng điều này sẽ giải quyết vấn đề của bạn.


-3

Điều tương tự cũng xảy ra với tôi với ký tự '-' (dấu trừ dài).
Tôi đã sử dụng thay thế đơn giản này để giải quyết nó:

htmlText = htmlText.Replace('–', '-');

4
Vấn đề của OP là mojibake, không phải các ký tự Unicode tương tự.
Cole Johnson
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.