“ & # 226; & # 226; something TM”显示在页面上,而不是“’”

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

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

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

enter image description here

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

enter image description here

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

383565 次浏览

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

或者使用 &rsquo;

如果您的内容类型已经是 UTF8,那么数据很可能已经到达了错误的编码。如果要从数据库获取数据,请确保数据库连接使用 UTF-8。

如果这是来自文件的数据,请确保该文件被正确编码为 UTF-8。您通常可以在您选择的编辑器的“另存为...”对话框中设置此选项。

如果在源文件中查看数据时数据已经中断,那么它很可能曾经是一个 UTF-8文件,但是在这个过程中以错误的编码保存了下来。

有什么问题吗,

它是一个 (RIGHT SINGLE QUOTATION MARK-U + 2019)字符,正被解码为 CP-1252而不是 RIGHT SINGLE QUOTATION MARK0。如果检查 RIGHT SINGLE QUOTATION MARK1表,就会看到这个字符的 UTF-8格式是由字节 0xE20x800x99组成的。如果您检查 RIGHT SINGLE QUOTATION MARK2,那么您将看到每个字节代表单个字符 â


我该怎么补救?

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


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

<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 代码(从 这篇文章复制而来) :

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

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


这里有一些更多的链接来了解更多关于这个问题的信息:

你的字符编码不匹配,你的字符串是用一种编码方式编码的(UTF-8) ,而解释这个页面的东西正在使用另一种编码方式(比如说 ASCII)。

始终在 http 头中指定编码,并确保这与框架的编码定义相匹配。

示例 http 头:

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

在 asp.net 中设置编码

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

在 jsp 中设置编码

同样的事情也发生在我的’-’字符(长减号)上。
我使用了这个简单的替换,所以解析它: < br >

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

我有一些文件,其中 显示为 …ê显示为 ê。这就是它是如何到达那里的(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)

(因为有人在正确的 UTF-8文档中插入了 twingled 版本,所以我实际上只需要提取 twingled 部分,然后将其去掉,再将其插入到正确的 UTF-8文档中。我用的是美丽汤(BeautifulSoup)。)

更有可能的情况是,你在内容创建方面有一个 Charlie,而不是 Web 服务器的配置是错误的。您还可以通过选择 utf-8文档的 windows-1252编码来强制 Web 浏览器调整页面。你的网页浏览器无法删除查理保存的文档。

注意 : 同样的问题可能发生在任何其他单字节代码页(例如 Latin-1)而不是 windows-1252上。

(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时生成 ’

这意味着源数据在发送到浏览器之前要经过 字符集转换:

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

    0xE2 0x80 0x99

  2. 这些单独的字节然后被 被误解了和解码到 Unicode 编码点 U+00E2 U+20AC U+2122通过其中一个 视窗 -125X字符集(1252,1254,1256和1258都映射 0xE2 0x80 0x99U+00E2 U+20AC U+2122) ,然后这些编码点被编码为 UTF-8字节:

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

您需要找到执行步骤2中的额外转换的位置并删除它。

您必须从 Word 文档中复制/粘贴文本。Word 文档使用智能引号。您可以使用特殊字符(& rsquo;)替换它,或者只需在 HTML 编辑器中键入(’)。< br > < br >

我相信这能解决你的问题。

如果有人在 WordPress 网站上得到这个错误,你需要更改 wp-config db 字符集:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

而不是:

define('DB_CHARSET', 'utf8mb4');

当字符串转换为 从 Windows-1252到 UTF-8 < em > 两次时,有时会发生这种情况。

我们在 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 ’

在 DBeaver (或其他编辑器)中,您正在处理的脚本文件可以提示另存为 UTF8,这将更改 char:

*

进入

–

或者

–

如果其他答案没有帮助,您可能需要检查数据库是否实际存储了 mojibread 字符。我在 utf-8中查看文本,但是我仍然看到 mojibac,结果是,由于数据库升级,文本已经永久“ mojibaked”。

在这种情况下,一种选择是使用 Python 的 50英尺包(或 JavaScript 版本 给你)“修复”文本。