Sayfada "" "yerine" â € ™ "gösteriliyor


133

’yerine sayfamda gösteriliyor '.

Hem etiketimde hem de HTTP üstbilgilerimde Content-Typeayarı var :UTF-8<head>

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

görüntü açıklamasını buraya girin

Ayrıca tarayıcım şu şekilde ayarlandı Unicode (UTF-8):

görüntü açıklamasını buraya girin

Peki sorun nedir ve nasıl düzeltebilirim?


Yanıtlar:


55

Tarayıcının ve düzenleyicinin ISO-8859-1 / Windows-1252 yerine UTF-8 kodlaması kullandığından emin olun.

Veya kullanın &rsquo;.


75
Hayır, çözülmedi. Uygulamanızdaki karakter kodlamasında hala bir tutarsızlık var. İleride diğer CP1252 olmayan karakterler için aynı problemle tekrar karşılaşacaksınız. Ve birçoğu var ...
BalusC

12
Karşılaşmaya devam edeceğiniz karakterlere örnekler: i18nqa.com/debug/utf8-debug.html
Zoot

utf-8 kodlaması +1
Karuhanga

217

Peki sorun ne?

UTF-8 yerine CP-1252 olarak kodu çözülen bir ( RIGHT SINGLE QUOTATION MARK- U + 2019) karakteridir . Eğer kontrol ederseniz kodlamalar tablo, o zaman bu karakter UTF-8 bayt oluşan olduğunu görmekteyiz , ve . Eğer işaretlerseniz CP-1252 kod sayfa düzenini , o zaman bu bayt her karakter standı olduğunu göreceksiniz , ve .0xE20x800x99â


ve nasıl düzeltebilirim?

Karakterleri okumak, yazmak, saklamak ve görüntülemek için CP-1252 yerine UTF-8 kullanın.


İçerik Türü hem etiketimde hem de <head>HTTP üstbilgilerimde UTF-8 olarak ayarlanmış :

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

Bu sadece istemciye karakterleri yorumlamak ve görüntülemek için hangi kodlamanın kullanılacağını bildirir. Bu, kendi programınıza karakterleri okumak, yazmak, saklamak ve görüntülemek için hangi kodlamanın kullanılacağını bildirmez. Tam cevap, kullanılan sunucu tarafı platforma / veritabanına / programlama diline bağlıdır. HTTP yanıt başlığındaki bir kümenin HTML meta etiketine göre önceliğe sahip olduğunu unutmayın. HTML meta etiketi yalnızca, sayfa HTTP yerine yerel disk dosya sisteminden açıldığında kullanılır.


Ayrıca tarayıcım şu şekilde ayarlandı Unicode (UTF-8):

Bu yalnızca istemciyi hangi kodlamanın karakterleri yorumlamak ve görüntülemek için kullanacağını zorlar. Ancak asıl sorun, ’bunun yerine istemciye zaten gönderiyor olmanız (UTF-8 ile kodlanmış) . İstemci, ’UTF-8 kodlamasını kullanarak doğru şekilde görüntülüyor . Müşteri, örneğin ISO-8859-1'i kullanmak için yanlış bilgilendirildiyse, ââ¬â¢bunun yerine muhtemelen görmüşsünüzdür .


Bir veritabanı ile ASP.NET 2.0 kullanıyorum.

Bu büyük olasılıkla sorununun yattığı yerdir. Verilerin neye benzediğini bağımsız bir veritabanı aracıyla doğrulamanız gerekir.

Eğer karakter var, o zaman doğru veritabanına bağlanmak değildir. Veritabanı bağlayıcısına UTF-8 kullanmasını söylemeniz gerekir.

Veritabanınız içeriyorsa ’, dağınık olan sizin veritabanınızdır. Büyük olasılıkla tablolar kullanılacak şekilde yapılandırılmamıştır UTF-8. Bunun yerine, yapılandırmaya bağlı olarak değişen veritabanının varsayılan kodlamasını kullanırlar. Sorununuz buysa, genellikle UTF-8'i kullanmak için tabloyu değiştirmek yeterlidir. Veritabanınız bunu desteklemiyorsa, tabloları yeniden oluşturmanız gerekir. Tabloyu oluştururken tablonun kodlamasını ayarlamak iyi bir uygulamadır.

Büyük olasılıkla SQL Server kullanıyorsunuz, ancak işte bazı MySQL kodu ( bu makaleden kopyalanmış ):

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

Tablonuz zaten UTF-8 ise, bir adım geri gitmeniz gerekir. Verileri oraya kim veya ne koydu. Sorun burada. Örnek olarak, HTML formunda gönderilen, yanlış kodlanmış / kodu çözülmüş değerler verilebilir.


Sorunla ilgili daha fazla bilgi edinmek için işte birkaç bağlantı daha:


2
Örneğin bir mysql veritabanında bir yere kaydedilmiş bunun gibi bir içeriği bozduysanız, stackoverflow.com/a/9407998/117647 , karakterleri utf-8'e dönüştürmek için ihtiyacınız olan numaraya sahiptir
Steve

5
TL; DR; Karakterleri okumak, yazmak, saklamak ve görüntülemek için UTF-8 kullanın.
c0degeas

İso-8859-1 ve Windows-1252 tablolarının üst üste geldiğine dikkat edin, bu nedenle bazı "garip karakter kombinasyonları" her ikisi için de ortaktır (örneğin "é" için "Ã ©").
Skippy le Grand Gourou

15

Bazı belgeleri olarak gösteriyordum …ve êolarak gösteriyordu ê. Oraya şu şekilde ulaştı (python kodu):

# 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

Sorunu çözmek için python kodunu şöyle kullandım:

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)

(Birisi twingled sürümü doğru bir UTF-8 belgesine yerleştirdiği için, aslında sadece kıvrılmış kısmı çıkarmak, gevşetmek ve tekrar yerleştirmek zorunda kaldım. Bunun için BeautifulSoup'u kullandım.)

İçerik oluşturmada bir Charlie'ye sahip olmanız, web sunucusu yapılandırmasının yanlış olmasından çok daha fazla olasıdır. Ayrıca, bir utf-8 belgesi için windows-1252 kodlamasını seçerek web tarayıcınızı sayfayı değiştirmeye zorlayabilirsiniz. Web tarayıcınız Charlie'nin kaydettiği belgeyi çözemez.

Not : Aynı sorun, windows-1252 yerine başka herhangi bir tek baytlık kod sayfasında (örneğin, latin-1) ortaya çıkabilir.


15

(Unicode kod noktası U+2019 RIGHT SINGLE QUOTATION MARK) UTF-8'de bayt olarak kodlanmıştır:

0xE2 0x80 0x99.

’(Unicode kod noktaları U+00E2 U+20AC U+2122) UTF-8'de bayt olarak kodlanmıştır:

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

Bunlar, ’UTF-8 olarak işlendiğinde üretmek için tarayıcınızın gerçekte aldığı baytlardır .

Bu, kaynak verilerinizin tarayıcıya gönderilmeden önce iki karakter grubu dönüşümünden geçtiği anlamına gelir :

  1. Kaynak karakter ( U+2019) ilk önce UTF-8 bayt olarak kodlanır:

    0xE2 0x80 0x99

  2. bu ayrı baytlar daha sonra yanlış yorumlandı ve Windows-125X karakter kümelerindenU+00E2 U+20AC U+2122 biri (1252, 1254, 1256 ve 1258 hepsi eşlenecek şekilde ) tarafından Unicode kod noktalarına çözüldü ve ardından bu kod noktaları UTF-8 bayt olarak kodlandı:0xE2 0x80 0x99U+00E2 U+20AC U+2122

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

2. adımda ekstra dönüştürmenin nerede yapıldığını bulmanız ve kaldırmanız gerekir.


12

Bu bazen bir dize Windows-1252'den UTF-8'e iki kez dönüştürüldüğünde gerçekleşir .

Bunu, muhtemelen MySQL bağlantısının doğru karakter setini belirtmemesinden dolayı, veritabanında bu tür karakterlerin göründüğü bir Zend / PHP / MySQL uygulamasında yaptık. Yapmalıydık:

  1. Zend ve PHP'nin veritabanı ile UTF-8'de iletişim kurduğundan emin olun ( varsayılan olarak değildi )

  2. Bozuk karakterleri bunun gibi birkaç SQL sorgusuyla onarın ...

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

    Bunu gerektiği kadar çok tablo / sütun için yapın.

Gerektiğinde bu dizelerden bazılarını PHP'de de düzeltebilirsiniz. Karakterleri kodlanmış olmasından dolayı geldiğini hatırlatırız iki kez , aslında bir ters dönüşüm yapmak gerekir dan ilk başta beni karıştı Windows'un-1252 için UTF-8 arka.

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

9

Karakter kodlamanızda bir uyuşmazlık var; dizeniz bir kodlamada (UTF-8) kodlanmıştır ve bu sayfayı yorumlayan her ne ise başka bir kod kullanmaktadır (örneğin ASCII).

Kodlamanızı her zaman http başlıklarınızda belirtin ve bunun çerçevenizin kodlama tanımıyla eşleştiğinden emin olun.

Örnek http başlığı:

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

Asp.net'te kodlamayı ayarlama

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

Jsp'de kodlamayı ayarlama


7

İçerik türünüz zaten UTF8 ise, büyük olasılıkla veriler zaten yanlış kodlamaya ulaşıyordur. Verileri bir veritabanından alıyorsanız, veritabanı bağlantısının UTF-8 kullandığından emin olun.

Bu bir dosyadan alınan verilerse, dosyanın UTF-8 olarak doğru şekilde kodlandığından emin olun. Bunu genellikle seçtiğiniz düzenleyicinin "Farklı kaydet ..." diyaloğunda ayarlayabilirsiniz.

Veriler, kaynak dosyada görüntülediğinizde zaten bozulmuşsa, muhtemelen bir UTF-8 dosyasıydı, ancak yol boyunca bir yerde yanlış kodlamayla kaydedilmiş olabilir.


4

Birisi WordPress web sitesinde bu hatayı alırsa, wp-config db karakter kümesini değiştirmeniz gerekir:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

onun yerine:

define('DB_CHARSET', 'utf8mb4');

0

DBeaver'da (veya diğer düzenleyicilerde), çalıştığınız komut dosyası UTF8 olarak kaydetmenizi isteyebilir ve bu, karakteri değiştirir:

â € “

içine

–

veya

–

-1

Word Belgesinden metin kopyalayıp yapıştırmanız gerekir. Word belgesi Akıllı Tırnaklar kullanır. Bunu Özel Karakterle (& rsquo;) değiştirebilir veya HTML düzenleyicinizi (') yazabilirsiniz.

Eminim bu sorununuzu çözecektir.


-3

Aynı şey '-' karakteriyle de başıma geldi (uzun eksi işareti).
Bu basit değiştirmeyi kullandım, bu yüzden çözün:

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

4
OP'nin sorunu, benzer Unicode karakterleri değil mojibake'dir.
Cole Johnson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.