2010-03-19 117 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 ’ 
相关问题