"â€"在页面上显示而不是"'"

Jit*_*yas 119 encoding utf-8 mojibake

’正在我的页面上显示而不是'.

我在我的标签和HTTP标头中都Content-Type设置了:UTF-8<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

另外,我的浏览器设置为Unicode (UTF-8):

在此输入图像描述

那么问题是什么,我该如何解决?

Bal*_*usC 204

所以有什么问题,

它是一个(RIGHT SINGLE QUOTATION MARK- U + 2019)字符,编码为CP-1252而不是UTF-8.如果你检查编码表,那么你会看到这个字符是由字节组成的UTF-8 0xE2,0x800x99.如果检查CP-1252代码页布局,那么您将看到每个字节代表单个字符â,并且.


我该如何解决?

使用UTF-8代替CP-1252来读取,写入,存储和显示字符.


我在我的<head>标记和HTTP标头中将Content-Type设置为UTF-8 :

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Run Code Online (Sandbox Code Playgroud)

这仅指示客户端使用哪种编码来解释和显示字符.这并不指示您自己的程序使用哪种编码来读取,写入,存储和显示字符.确切的答案取决于所使用的服务器端平台/数据库/编程语言.请注意,HTTP响应头中设置的一个优先于HTML元标记.仅当从本地磁盘文件系统而不是从HTTP打开页面时,才会使用HTML元标记.


另外,我的浏览器设置为Unicode (UTF-8):

这仅强制客户端使用哪种编码来解释和显示字符.但实际问题是你已经发送’(用UTF-8编码)给客户端而不是.客户端’使用UTF-8编码正确显示.如果客户端使用错误,例如ISO-8859-1,您可能会看到ââ¬â¢相反的情况.


我使用ASP.NET 2.0与数据库.

这很可能是您的问题所在.您需要使用独立的数据库工具验证数据的外观.

如果该字符在那里,那么您没有正确连接到数据库.您需要告诉数据库连接器使用UTF-8.

如果你的数据库包含’,那么你的数据库就搞砸了.很可能表格未配置使用UTF-8.相反,它们使用数据库的默认编码,该编码因配置而异.如果这是您的问题,那么通常只需更改表以使用UTF-8即可.如果您的数据库不支持,则需要重新创建表.最好在创建表时设置表的编码.

您最有可能使用SQL Server,但这里有一些MySQL代码(从本文复制):

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

如果您的桌子已经是UTF-8,那么您需要退后一步.什么把数据放在那里.这就是问题所在.一个例子是HTML表单提交的值,这些值被错误地编码/解码.


以下是一些了解该问题的更多链接:

  • 彻底而广泛的回答,+ 1. (21认同)
  • TL; DR;**使用UTF-8读取,写入,存储和显示字符.** (3认同)
  • 如果你已经将这样的内容保存在某个地方,例如在mysql数据库中保存,那么http://stackoverflow.com/a/9407998/117647就有了将字符转换为utf-8所需的技巧 (2认同)

ken*_*ytm 52

确保浏览器和编辑器使用UTF-8编码而不是ISO-8859-1/Windows-1252.

或者使用&rsquo;.

  • 不,它没有解决.您的应用程序中的字符编码仍然存在不一致.对于其他非CP1252字符,您将来会再次遇到同样的问题.它们中有很多...... (74认同)
  • 您将继续遇到的字符示例:http://www.i18nqa.com/debug/utf8-debug.html (10认同)

Ter*_*way 14

我有一些文件显示为…ê显示为ê.它就是这样的(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
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我使用了这样的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)
Run Code Online (Sandbox Code Playgroud)

(因为有人将这个混合的版本插入到正确的UTF-8文档中,我实际上只需要提取混合部分,将其去掉并将其重新插入.我使用了BeautifulSoup.)

您在内容创建中拥有Charlie的可能性远远大于Web服务器配置错误.您还可以通过为utf-8文档选择windows-1252编码来强制Web浏览器翻转页面.您的Web浏览器无法解除Charlie保存的文档.

注意:任何其他单字节代码页(例如latin-1)而不是windows-1252都会出现同样的问题.


Rem*_*eau 12

(Unicode代码点U+2019 RIGHT SINGLE QUOTATION MARK)以UTF-8编码为字节:

0xE2 0x80 0x99.

’(Unicode代码点U+00E2 U+20AC U+2122)以UTF-8编码为字节:

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

这些是您的浏览器实际接收的字节,以便’在处理为UTF-8时生成.

这意味着您的源数据在发送到浏览器之前将经历两次 charset转换:

  1. 字符(U+2019)首先编码为UTF-8字节:

    0xE2 0x80 0x99

  2. 那些单独的字节然后被一个Windows-125X字符集(1252,1254,1256和1258全部映射到)错误解释并解码为Unicode代码点,然后这些代码点被编码为UTF-8字节:U+00E2 U+20AC U+21220xE2 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中额外转换的位置并将其删除.


Dav*_*ers 9

你的角色编码不匹配; 你的字符串是用一种编码(UTF-8)编码的,无论解释这个页面是用另一种(比如ASCII).

始终在http标头中指定您的编码,并确保这符合您的框架的编码定义.

示例http标头:

Content-Type    text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

在asp.net中设置编码

<configuration>
  <system.web>
    <globalization
      fileEncoding="utf-8"
      requestEncoding="utf-8"
      responseEncoding="utf-8"
      culture="en-US"
      uiCulture="de-DE"
    />
  </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

在jsp中设置编码


Sim*_*ast 8

当字符串从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);
    
    Run Code Online (Sandbox Code Playgroud)

    根据需要为尽可能多的表/列执行此操作.

如有必要,您还可以在PHP中修复其中一些字符串.请注意,因为字符已被编码两次,我们实际上需要 UTF-8 反向转换回Windows-1252,这一开始让我很困惑.

mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’
Run Code Online (Sandbox Code Playgroud)


Pek*_*ica 7

如果您的内容类型已经是UTF8,则数据可能已经以错误的编码方式到达.如果要从数据库获取数据,请确保数据库连接使用UTF-8.

如果这是来自文件的数据,请确保将文件正确编码为UTF-8.您通常可以在您选择的编辑器的"另存为..."对话框中进行设置.

如果在源文件中查看数据时数据已经中断,则可能它曾经是UTF-8文件,但在此过程中某处保存的编码错误.


Gor*_*vic 5

如果有人在 WordPress 网站上收到此错误,则需要更改 wp-config db 字符集:

define('DB_CHARSET', 'utf8mb4_unicode_ci');
Run Code Online (Sandbox Code Playgroud)

代替:

define('DB_CHARSET', 'utf8mb4');
Run Code Online (Sandbox Code Playgroud)