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,0x80和0x99.如果检查CP-1252代码页布局,那么您将看到每个字节代表单个字符â,€并且™.
我该如何解决?
使用UTF-8代替CP-1252来读取,写入,存储和显示字符.
我在我的
<head>标记和HTTP标头中将Content-Type设置为UTF-8 :Run Code Online (Sandbox Code Playgroud)<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代码(从本文复制):
CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)
如果您的桌子已经是UTF-8,那么您需要退后一步.谁或什么把数据放在那里.这就是问题所在.一个例子是HTML表单提交的值,这些值被错误地编码/解码.
以下是一些了解该问题的更多链接:
ken*_*ytm 52
确保浏览器和编辑器使用UTF-8编码而不是ISO-8859-1/Windows-1252.
或者使用’.
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转换:
源’字符(U+2019)首先编码为UTF-8字节:
0xE2 0x80 0x99
那些单独的字节然后被一个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中额外转换的位置并将其删除.
你的角色编码不匹配; 你的字符串是用一种编码(UTF-8)编码的,无论解释这个页面是用另一种(比如ASCII).
始终在http标头中指定您的编码,并确保这符合您的框架的编码定义.
示例http标头:
Content-Type text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)
<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)
当字符串从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);
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)
如果您的内容类型已经是UTF8,则数据可能已经以错误的编码方式到达.如果要从数据库获取数据,请确保数据库连接使用UTF-8.
如果这是来自文件的数据,请确保将文件正确编码为UTF-8.您通常可以在您选择的编辑器的"另存为..."对话框中进行设置.
如果在源文件中查看数据时数据已经中断,则可能它曾经是UTF-8文件,但在此过程中某处保存的编码错误.
如果有人在 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)
| 归档时间: |
|
| 查看次数: |
231682 次 |
| 最近记录: |