„Â € ™” wyświetlane na stronie zamiast „” ”


135

’wyświetla się na mojej stronie zamiast '.

Mam Content-Typeustawione na UTF-8w moim <head>tagu i nagłówkach HTTP:

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

wprowadź opis obrazu tutaj

Ponadto moja przeglądarka jest ustawiona na Unicode (UTF-8):

wprowadź opis obrazu tutaj

Więc na czym polega problem i jak mogę to naprawić?


Odpowiedzi:


55

Upewnij się, że przeglądarka i edytor używają kodowania UTF-8 zamiast ISO-8859-1 / Windows-1252.

Lub użyj &rsquo;.


75
Nie, to nie jest rozwiązane. Nadal występuje niespójność w kodowaniu znaków w Twojej aplikacji. W przyszłości ponownie napotkasz ten sam problem dla innych znaków spoza CP1252. I jest ich całkiem sporo ...
BalusC

12
Przykłady postaci, z którymi nadal będziesz się spotykać: i18nqa.com/debug/utf8-debug.html
Zoot

kodowanie utf-8 +1
Karuhanga

225

Więc w czym problem,

Jest to znak ( RIGHT SINGLE QUOTATION MARK- U + 2019), który jest dekodowany jako CP-1252 zamiast UTF-8 . Jeśli sprawdzisz tabelę kodowania , zobaczysz, że ten znak jest w UTF-8 złożony z bajtów 0xE2, 0x80a 0x99. Jeśli zaznaczysz układ strony kodowej CP-1252 , to zobaczysz, że każda z tych bajtów oznaczają poszczególne znaki â, i .


i jak mogę to naprawić?

Użyj UTF-8 zamiast CP-1252 do odczytu, zapisu, przechowywania i wyświetlania znaków.


Mam ustawioną wartość Content-Type na UTF-8 zarówno w moim <head>tagu, jak i w nagłówkach HTTP:

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

To tylko instruuje klienta, jakiego kodowania użyć do interpretacji i wyświetlenia znaków. To nie instruuje twojego własnego programu, jakiego kodowania użyć do odczytu, zapisu, przechowywania i wyświetlania znaków. Dokładna odpowiedź zależy od używanej platformy / bazy danych / języka programowania po stronie serwera. Zwróć uwagę, że ten ustawiony w nagłówku odpowiedzi HTTP ma pierwszeństwo przed metatagiem HTML. Metatag HTML byłby używany tylko wtedy, gdy strona jest otwierana z lokalnego systemu plików, a nie z protokołu HTTP.


Ponadto moja przeglądarka jest ustawiona na Unicode (UTF-8):

Wymusza to tylko na kliencie, którego kodowania użyć do interpretacji i wyświetlenia znaków. Ale rzeczywisty problem polega na tym, że już wysyłasz ’(zakodowane w UTF-8) do klienta zamiast . Klient poprawnie wyświetla obraz ’przy użyciu kodowania UTF-8. Jeśli klient został błędnie poinstruowany, aby użyć, na przykład ISO-8859-1, prawdopodobnie zobaczyłeś ââ¬â¢zamiast tego.


Używam ASP.NET 2.0 z bazą danych.

Najprawdopodobniej jest to twój problem. Musisz sprawdzić za pomocą niezależnego narzędzia bazodanowego, jak wyglądają dane.

Jeśli postać tam jest, oznacza to, że nie łączysz się poprawnie z bazą danych. Musisz powiedzieć łącznikowi bazy danych, aby używał UTF-8.

Jeśli twoja baza danych zawiera ’, to twoja baza danych jest pomieszana. Najprawdopodobniej tabele nie są skonfigurowane do używania UTF-8. Zamiast tego używają domyślnego kodowania bazy danych, które różni się w zależności od konfiguracji. Jeśli to jest twój problem, zwykle wystarczy zmienić tabelę, aby używała UTF-8. Jeśli Twoja baza danych tego nie obsługuje, musisz ponownie utworzyć tabele. Dobrą praktyką jest ustawienie kodowania tabeli podczas jej tworzenia.

Najprawdopodobniej używasz SQL Server, ale tutaj jest kod MySQL (skopiowany z tego artykułu ):

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

Jeśli jednak twój stół jest już UTF-8, musisz cofnąć się o krok. Kto lub co umieścił tam dane. Tu jest problem. Jednym z przykładów mogą być wartości przesłane w formularzu HTML, które są nieprawidłowo zakodowane / zdekodowane.


Oto kilka linków, aby dowiedzieć się więcej o problemie:


2
Jeśli masz taką zepsutą zawartość zapisaną gdzieś np. W bazie danych mysql, stackoverflow.com/a/9407998/117647 ma sztuczkę, którą musisz przekonwertować znaki na utf-8
Steve

5
TL; DR; Użyj UTF-8 do czytania, pisania, przechowywania i wyświetlania znaków.
c0degeas

Zauważ, że tabele iso-8859-1 i Windows-1252 nakładają się, więc niektóre „dziwne kombinacje znaków” są wspólne dla obu (np. „Ă ©” dla „é”).
Skippy le Grand Gourou

1
@Babyburger: jest już wymienione w odpowiedzi jako pierwsze łącze na liście 3 linków na dole.
BalusC

16

Mam kilka dokumentów, w których był wyświetlany jako …i êbył wyświetlany jako ê. Oto jak to się tam dostało (kod w Pythonie):

# 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

Aby rozwiązać problem, użyłem kodu Pythona w następujący sposób:

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)

(Ponieważ ktoś włożył pokręconą wersję do poprawnego dokumentu UTF-8, w rzeczywistości musiałem wydobyć tylko skręconą część, rozłożyć ją i włożyć z powrotem. Użyłem do tego BeautifulSoup.)

Jest o wiele bardziej prawdopodobne, że masz Charliego podczas tworzenia treści, niż że konfiguracja serwera WWW jest nieprawidłowa. Możesz także zmusić przeglądarkę internetową do skręcania strony, wybierając kodowanie Windows-1252 dla dokumentu utf-8. Twoja przeglądarka internetowa nie może rozplątać dokumentu, który zapisał Charlie.

Uwaga : ten sam problem może wystąpić w przypadku dowolnej innej jednobajtowej strony kodowej (np. Latin-1) zamiast windows-1252.


15

(Punkt kodowy Unicode U+2019 RIGHT SINGLE QUOTATION MARK) jest kodowany w UTF-8 jako bajty:

0xE2 0x80 0x99.

’(Punkty kodowe Unicode U+00E2 U+20AC U+2122) są kodowane w UTF-8 jako bajty:

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

Są to bajty, które Twoja przeglądarka faktycznie otrzymuje w celu ’przetworzenia jako UTF-8.

Oznacza to, że Twoje dane źródłowe przechodzą przez dwie konwersje zestawu znaków, zanim zostaną wysłane do przeglądarki:

  1. Znak źródłowy ( U+2019) jest najpierw kodowany jako bajty UTF-8:

    0xE2 0x80 0x99

  2. te pojedyncze bajty były następnie błędnie interpretowane i dekodowane do punktów kodowych Unicode U+00E2 U+20AC U+2122przez jeden z zestawów znaków Windows-125X (1252, 1254, 1256 i 1258 wszystkie mapowane 0xE2 0x80 0x99na U+00E2 U+20AC U+2122), a następnie te punkty kodowe są kodowane jako bajty UTF-8:

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

Musisz znaleźć miejsce wykonywania dodatkowej konwersji w kroku 2 i usunąć ją.


11

Zdarza się to czasami, gdy ciąg jest dwukrotnie konwertowany z Windows-1252 na UTF-8 .

Mieliśmy to w aplikacji Zend / PHP / MySQL, w której takie znaki pojawiały się w bazie danych, prawdopodobnie z powodu połączenia MySQL, które nie określało prawidłowego zestawu znaków. Musieliśmy:

  1. Upewnij się, że Zend i PHP komunikowały się z bazą danych w UTF-8 ( domyślnie nie było )

  2. Napraw uszkodzone znaki za pomocą kilku zapytań SQL, takich jak to ...

    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);
    

    Zrób to dla tylu tabel / kolumn, ile potrzeba.

Jeśli to konieczne, możesz również naprawić niektóre z tych ciągów w PHP. Zwróć uwagę, że ponieważ znaki zostały zakodowane dwukrotnie , w rzeczywistości musimy wykonać odwrotną konwersję z UTF-8 z powrotem na Windows-1252, co na początku mnie zmyliło.

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

9

Masz niedopasowanie w kodowaniu znaków; Twój ciąg jest zakodowany w jednym kodowaniu (UTF-8), a cokolwiek interpretuje tę stronę, używa innego (powiedzmy ASCII).

Zawsze określaj kodowanie w nagłówkach http i upewnij się, że jest to zgodne z definicją kodowania używaną przez platformę.

Przykładowy nagłówek http:

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

Ustawianie kodowania w asp.net

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

Ustawienie kodowania w jsp


7

Jeśli typ zawartości to już UTF8, prawdopodobnie dane docierają już w niewłaściwym kodowaniu. Jeśli pobierasz dane z bazy danych, upewnij się, że połączenie z bazą danych korzysta z UTF-8.

Jeśli są to dane z pliku, upewnij się, że plik jest poprawnie zakodowany jako UTF-8. Zwykle można to ustawić w oknie dialogowym „Zapisz jako ...” wybranego edytora.

Jeśli dane są już zepsute, gdy przeglądasz je w pliku źródłowym, istnieje prawdopodobieństwo, że był to plik UTF-8, ale został zapisany w niewłaściwym kodowaniu gdzieś po drodze.


4

Jeśli ktoś otrzyma ten błąd na stronie WordPress, musisz zmienić kod charset db wp-config:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

zamiast:

define('DB_CHARSET', 'utf8mb4');

0

W DBeaver (lub innych edytorach) plik skryptu, nad którym pracujesz, może monitować o zapisanie jako UTF8, co zmieni znak:

â € “

w

–

lub

–

-1

Musisz skopiować / wkleić tekst z dokumentu programu Word. Dokument Word używa inteligentnych cytatów. Możesz go zastąpić znakiem specjalnym (& rsquo;) lub po prostu wpisać w edytorze HTML (').

Jestem pewien, że to rozwiąże Twój problem.


-3

To samo stało się ze znakiem „-” (długi znak minus).
Użyłem tej prostej zamiany, więc rozwiąż ją:

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

4
Problemem OP jest mojibake, a nie podobne znaki Unicode.
Cole Johnson,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.