“’” 显示在页面上,而不是“'”

Posted

技术标签:

【中文标题】“’” 显示在页面上,而不是“\'”【英文标题】:"’" showing on page instead of " ' "“’” 显示在页面上,而不是“'” 【发布时间】:2011-01-29 11:10:13 【问题描述】:

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

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

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

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

那么问题出在哪里,我该如何解决?

【问题讨论】:

见***.com/questions/38363566/…中的“Mojibake” 【参考方案1】:

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

在这种情况下,一种选择是使用 Python 的 ftfy 包(或 javascript 版本 here)“修复”文本。

【讨论】:

5 多年前,当我编写 ftfy 库的糟糕副本时,我真的需要这个答案。 ?【参考方案2】:

那么有什么问题,

这是一个 (RIGHT SINGLE QUOTATION MARK - U+2019) 字符,它被解码为CP-1252 而不是UTF-8。如果您查看encodings 表,您会看到该字符是由字节0xE20x800x99 组成的UTF-8。如果您检查CP-1252 code page layout,那么您会看到每个字节代表â 的各个字符。


我该如何解决?

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


我的 &lt;head&gt; 标记和 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 代码(复制自 this article):

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

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


这里有更多链接可以了解更多有关该问题的信息:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),来自我们自己的 Joel。 Unicode - How to get the characters right?,信息更简洁实用,针对Java环境的解决方案。 How to setup your php site to use UTF8,针对 PHP 环境。

【讨论】:

如果您将此类损坏的内容保存在某个地方,例如 mysql 数据库中,***.com/a/9407998/117647 有您需要将字符转换为 utf-8 的技巧 TL;DR; 使用 UTF-8 读取、写入、存储和显示字符。 请注意,iso-8859-1 和 Windows-1252 表是重叠的,因此一些“奇怪的字符组合”对两者都是通用的(例如,“é”代表“é”)。【参考方案3】:

在 DBeaver(或其他编辑器)中,您正在处理的脚本文件会提示您保存为 UTF8,这将改变字符:

-

进入

–

–

【讨论】:

【参考方案4】:

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

我们在 Zend/PHP/MySQL 应用程序中遇到了这种情况,其中类似的字符出现在数据库中,可能是由于 MySQL 连接未指定正确的字符集。我们必须:

    确保 Zend 和 PHP 以 UTF-8 与数据库通信(默认情况下 不是

    用这样的几个 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 ’

【讨论】:

太棒了。 !!我尝试了整个互联网没有任何工作,只有这个:)谢谢兄弟......【参考方案5】:

您的字符编码不匹配;您的字符串以一种编码 (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

【讨论】:

【参考方案6】:

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

define('DB_CHARSET', 'utf8mb4_unicode_ci');

代替:

define('DB_CHARSET', 'utf8mb4');

【讨论】:

感谢救世主先生【参考方案7】:

您必须从 Word 文档中复制/粘贴文本。 Word 文档使用智能引号。您可以将其替换为特殊字符 (’) 或直接在 HTML 编辑器中输入 (')。

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

【讨论】:

【参考方案8】:

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

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

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

    0xE2 0x80 0x99

    这些单独的字节随后被错误解释并被 Windows-125X 字符集之一(1252、1254、1256 和1258 all map 0xE2 0x80 0x99 to U+00E2 U+20AC U+2122),然后这些代码点被编码为 UTF-8 字节:

    0xE2 -> U+00E2 -> 0xC3 0xA20x80 -> U+20AC -> 0xE2 0x82 0xAC0x99 -> U+2122 -> 0xE2 0x84 0xA2

您需要找到在第 2 步中执行额外转换的位置并将其删除。

【讨论】:

【参考方案9】:

我有一些文件,其中 显示为…ê 显示为ê。它就是这样到达那里的(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 部分,将其去除并重新插入。我为此使用了 BeautifulSoup。)

您在内容创建方面遇到 Charlie 的可能性远大于 Web 服务器配置错误的可能性。您还可以通过为 utf-8 文档选择 windows-1252 编码来强制 Web 浏览器闪烁页面。您的网络浏览器无法消除 Charlie 保存的文档。

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

【讨论】:

【参考方案10】:

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

或使用&amp;rsquo;

【讨论】:

不,没有解决。您的应用程序中的字符编码仍然不一致。对于其他非 CP1252 角色,您将来会再次遇到同样的问题。而且还有很多...... 您将继续遇到的字符示例:i18nqa.com/debug/utf8-debug.html【参考方案11】:

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

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

如果在源文件中查看数据时数据已经损坏,则很可能它曾经是一个 UTF-8 文件,但在此过程中以错误的编码保存。

【讨论】:

【参考方案12】:

“-”字符(长减号)也发生在我身上。 我使用了这个简单的替换来解决它:

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

【讨论】:

OP的问题是mojibake,不是类似的Unicode字符。

以上是关于“’” 显示在页面上,而不是“'”的主要内容,如果未能解决你的问题,请参考以下文章

HTML 编码问题 - 显示“”字符而不是“ ”

“”字符出现而不是“ ”

DIV 内容显示在页面而不是 JQuery 对话框上

如何在旧视图上显示微调器而不是主干中的空白页面

Laravel 页面显示“此页面不工作”而不是错误

结合上下文和表单时,模板显示标记而不是页面