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

时间:2010-03-19 13:04:43

标签: encoding utf-8 mojibake

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

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

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

enter image description here

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

enter image description here

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

13 个答案:

答案 0 :(得分:195)

  

那么问题是什么,

这是RIGHT SINGLE QUOTATION MARK - U + 2019)字符,已编码为CP-1252而不是UTF-8。如果您检查encodings表,则会看到此字符为UTF-8,由字节0xE20x800x99组成。如果您选中CP-1252 code page layout,则会看到每个字节代表单个字符â


  

我该如何解决?

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


  

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

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

这仅指示客户端使用哪种编码来解释和显示字符。这并不指示您自己的程序使用哪种编码来读取,写入,存储和显示字符。确切的答案取决于所使用的服务器端平台/数据库/编程语言。请注意,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代码(从this article复制):

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

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


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

答案 1 :(得分:48)

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

或使用&rsquo;

答案 2 :(得分: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

为了解决这个问题,我使用了这样的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文档中,我实际上只需要提取混合部分,将其去掉并将其重新插入。我使用了BeautifulSoup。)

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

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

答案 3 :(得分:10)

(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. 那些单独的字节被误解释并被其中一个 Windows-125X 字符集解码为Unicode代码点U+00E2 U+20AC U+2122(1252, 1254,1256和1258都将0xE2 0x80 0x99映射到U+00E2 U+20AC U+2122),然后这些码点被编码为UTF-8字节:

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

  3. 您需要找到执行步骤2中额外转化的位置并将其删除。

答案 4 :(得分:8)

您的角色编码不匹配;你的字符串是用一种编码(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

答案 5 :(得分:7)

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

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

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

答案 6 :(得分:7)

当字符串从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);
    

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

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

    mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’
    

答案 7 :(得分:4)

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

define('DB_CHARSET', 'utf8mb4_unicode_ci');

而不是:

define('DB_CHARSET', 'utf8mb4');

答案 8 :(得分:0)

在DBeaver(或其他编辑器)中,正在使用的脚本文件可能会提示另存为UTF8,这将更改字符:

进入

–

–

答案 9 :(得分:0)

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

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

答案 10 :(得分:-1)

您必须从Word文档中复制/粘贴文本。 Word文档使用智能引号。您可以将其替换为特殊字符(&amp; rsquo;)或只需键入HTML编辑器(')。

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

答案 11 :(得分:-3)

同样的事情发生在' - '字符(长号减号)上 我使用了这个简单的替换,所以解决它:

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

答案 12 :(得分:-5)

而不是英镑符号我用过:&amp;磅;没有空间。这为我解决了这个问题。

对于欧元:&amp;欧元;没有空间。