2010-03-19 119 views
85

’顯示在我的頁面上而不是'」「」在頁面上顯示而不是「」「

我有Content-Type設置爲我的兩個<head>標籤UTF-8和我的HTTP頭:

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

enter image description here

另外,我的瀏覽器設置爲Unicode (UTF-8)

enter image description here

那麼這有什麼問題,我該如何解決?

回答

35

確保瀏覽器和編輯器使用UTF-8編碼,而不是ISO-8859-1/Windows-1252。

或使用&rsquo;

+0

「或者使用’」。問題解決了。 – 2010-03-19 13:48:19

+54

不,它沒有解決。在您的應用程序中,字符編碼仍然存在不一致。您將來會重新遇到其他非CP1252字符的相同問題。其中有相當多的...... – BalusC 2010-03-19 13:51:22

+6

您將繼續遇到的字符示例:http://www.i18nqa.com/debug/utf8-debug.html – Zoot 2014-01-28 16:38:42

5

如果您的內容類型已經是UTF8,那麼很可能數據已經到達錯誤的編碼。如果您從數據庫獲取數據,請確保數據庫連接使用UTF-8。

如果這是來自文件的數據,請確保該文件正確編碼爲UTF-8。您通常可以在您選擇的編輯器的「另存爲...」對話框中進行設置。

如果在源文件中查看數據時數據已經損壞,那麼很可能它曾經是一個UTF-8文件,但在一路上被保存在錯誤的編碼中。

157

那麼,有什麼問題,

這是一個RIGHT SINGLE QUOTATION MARK - U + 2019)進行了編碼爲CP-1252而不是UTF-8字符。如果您檢查encodings表,那麼您會看到該字符是由字節0xE2,0x800x99組成的UTF-8。如果您檢查CP-1252 code page layout,那麼您會看到每個字節代表單個字符â,


,我該如何解決?

使用UTF-8而不是CP-1252來讀取,寫入,存儲和顯示字符。


我的Content-Type在我的兩個<head>標籤設置爲UTF-8和我的HTTP頭:

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

這僅指示客戶端用來解釋其編碼並顯示字符。這並不指示您自己的程序使用哪種編碼來讀取,寫入,存儲和顯示字符。確切答案取決於所使用的服務器端平臺/數據庫/編程語言。請注意,在HTTP響應頭中設置的優先級高於HTML元標記。 HTML元標記只能在從本地磁盤文件系統而不是HTTP打開頁面時使用。


另外,我的瀏覽器設置爲Unicode (UTF-8)

這隻強制客戶端用來解釋和顯示的字符,編碼。但實際的問題是,您已經將’(以UTF-8編碼)發送給客戶端,而不是。客戶端正在使用UTF-8編碼正確顯示’。如果客戶被錯誤地使用,例如ISO-8859-1,您可能會看到ââ¬â¢


我使用ASP.NET 2.0中使用的數據庫。

這很可能是您的問題所在。您需要使用獨立的數據庫工具驗證數據的外觀。

如果字符在那裏,那麼您沒有正確連接到數據庫。您需要告訴數據庫連接器使用UTF-8。

如果你的數據庫包含’,那麼它就是你的數據庫搞砸了。很可能這些表格未配置爲使用UTF-8。相反,他們使用數據庫的默認編碼,這取決於配置。如果這是你的問題,那麼通常只是改變表使用UTF-8就足夠了。如果你的數據庫不支持,你需要重新創建表。創建表格時,最好設置表格的編碼。

你最有可能使用SQL Server,但這裏是一些MySQL的代碼(從this article複製):

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

如果你的表格是已經但是UTF-8,那麼你需要退後一步。 誰在什麼把數據放在那裏。 這就是問題所在。一個例子是HTML表單提交的值被錯誤地編碼/解碼。


這裏有一些更多的聯繫,以瞭解更多有關該問題:

+13

徹底而廣泛的答案,+1。 – ulidtko 2014-08-14 12:36:52

+1

如果你有這樣的內容保存在某個地方,例如在一個MySQL數據庫中,http://stackoverflow.com/a/9407998/117647有你需要將字符轉換爲utf-8的技巧 – Steve 2016-06-01 08:18:24

4

您的字符編碼有不匹配;你的字符串被編碼爲一種編碼(UTF-8),無論是解釋這個頁面是使用另一種(如ASCII)。

總是在你的http頭文件中指定你的編碼,並確保它符合你的框架的編碼定義。

樣品HTTP標頭:

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

Setting encoding in asp.net

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

Setting encoding in jsp

-3

同樣的事情發生在我身上用 ' - ' 字符(長減號)。
我用這個簡單的更換,從而解決這個問題:

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

OP的問題是mojibake,而不是類似的Unicode字符。 – 2013-12-28 07:04:14

10

我有一些文件,其中被顯示爲…ê被顯示爲ê。這是如何到達那裏(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 

要解決這個問題,我用Python代碼是這樣的:

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) 

(因爲有人插入twingled版本爲正確的UTF- 8號文件,實際上我只提取twingled部分,detwingle它和我用BeautifulSoup此將其插回。)

這是更有可能的是,你在內容創作有查理比Web服務器配置錯誤。您還可以通過爲utf-8文檔選擇windows-1252編碼來強制您的Web瀏覽器混淆頁面。您的網絡瀏覽器不能排除查理保存的文檔。

注意:使用任何其他單字節代碼頁(例如latin-1)而不是windows-1252可能會發生同樣的問題。

+0

這是關於如何發生的最好解釋 – 2016-06-29 16:15:24

-4

取而代之的是我用過的磅牌:&磅;沒有空間。這爲我解決了這個問題。

歐元:&歐元;沒有空間。

5

(統一代碼點U+2019 RIGHT SINGLE QUOTATION MARK)以UTF-8編碼爲字節:

0xE2 0x80 0x99

’(Unicode代碼點U+00E2 U+20AC U+2122)以UTF-8編碼爲字節:

  0xC3 0xA2   0xE2 0x82 0xAC0xE2 0x84 0xA2

這些是您的瀏覽器實際接收的字節數,以UTF-8處理時生成’

這意味着,源數據被髮送到瀏覽器之前通過2個字符集轉換打算:

  1. 字符(U+2019)首先編碼爲UTF-8字節:

    0xE2 0x80 0x99

  2. 那些單個字節然後是錯誤解釋並解碼爲Unicode由Windows的125X字符集的一個(1252,1254,1256,和1258的所有地圖0xE2 0x80 0x99U+00E2 U+20AC U+2122)碼點U+00E2 U+20AC U+2122,然後將這些碼點被編碼爲UTF-8字節:

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

您需要找到正在執行步驟2中額外轉換的位置並將其刪除。

+0

對我來說,最有用的答案自然是來自Pascal專家! – Slashback 2017-12-02 17:30:50

-1

您必須從Word文檔複製/粘貼文本。 Word文檔使用智能引號。你可以用特殊字符(& rsquo;)替換它,或者直接輸入你的HTML編輯器(')。

我相信這會解決您的問題。

1

如果有人得到WordPress的網站這個錯誤,您需要更改WP-配置數據庫字符集:代替

define('DB_CHARSET', 'utf8mb4_unicode_ci'); 

define('DB_CHARSET', 'utf8mb4'); 
4

當一個字符串轉換而來這有時會發生Windows-1252到UTF-8 兩次

我們在Zend/PHP/MySQL應用程序中看到類似這樣的字符出現在數據庫中,這可能是由於MySQL連接沒有指定正確的字符集。我們必須:

  1. 確保Zend公司和PHP用UTF-8格式的數據庫進行通信(是不是通過默認)

  2. 修復損壞的字符,像這樣幾個SQL查詢...

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

    根據需要對此進行儘可能多的表/列操作。

如果需要,您還可以在PHP中修復其中一些字符串。請注意,由於字符編碼爲兩次,我們實際上需要做一個反向轉換 UTF-8回到Windows-1252,這首先使我感到困惑。

mb_convert_encoding('’', 'Windows-1252', 'UTF-8'); // returns ’ 
相關問題