特殊字符未按预期显示

24

我有以下简单的HTML页面:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <div>
        méywe
    </div>
</body>
</html>
在 Chrome 或 Firefox 中显示时(我没有测试其他浏览器),我看到了以下内容:
m�ywe 我错过了什么?html 文件以 UTF-8 编码保存。服务器是 Apache。我的机器是 Windows 7 pro。文本编辑器是 UltraEdit。
谢谢!
更新
最初,我使用 UltraEdit 编辑这个 html 文件并遇到了问题。根据 cmbuckley 的建议和 Notepad++(来自 Heatmanofurioso 的建议)的安装,我考虑到文件可能在某种程度上损坏了(即使它在 UltraEdit 和 Notepad 中都看起来不错)。所以我用 Notepad 以 utf-8 编码保存了文件。还是看到了同样的问题(可能是由于缓存?)然后我再次用 UltraEdit 保存它。在浏览器中查看页面,问题解决了。
吸取教训
如果你的工具是这样的话,拥有两个文本编辑器,并在遇到无法解释的问题时尝试使用不同的编辑器。没有完美的工具,即使你每天使用一个。在我的情况下,Notepad++ 修复了 UltraEdit 某些方面未能解决的 utf8 问题。
感谢大家的帮助!

可能是因为该字体不受浏览器支持。 - Lal
1
浏览器呈现页面的编码是什么?我知道应该是UTF-8,但它也不应该引起任何问题... - Avalanche
1
你确定它是UTF-8编码吗?执行hexdump -C file.html命令会显示什么?méywe的字节应该是6d c3 a9 79 77 65,其中c3 a9代表é - cmbuckley
isherwood,我没有添加任何字体规格。浏览器使用它们的默认设置。在Chrome中,我发现在“计算样式”下是Times New Roman字体。在Firefox中找不到这个信息。 - curious1
3
只是评论一下你对尝试解决问题表现出的极大兴趣,并在最后更新了你获得答案的方式和结果。很少有人这样做,如果我可以给你的问题投更多票,我会的。我现在很少看到这种兴趣了。太棒了! - Heatmanofurioso
显示剩余4条评论
7个回答

57
1-替换您的

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

2- 检查您的HTML编辑器的编码是否为UTF8。通常,此选项在程序顶部的选项卡中找到,就像在Notepad++中一样。

3- 检查您的浏览器是否与您的字体兼容,如果您以某种方式导入了字体。或尝试添加CSS将您的字体设置为默认/普遍接受的字体之一,如:

body
{
    font-family: "Times New Roman", Times, serif;
}

希望这能有所帮助:)


为什么要给我的回答点踩? 请至少解释一下原因。 - Heatmanofurioso
3
刚刚尝试了样式和元数据的更改,但都没有起作用。可能是其他人踩了(dislike)。谢谢回复! - curious1
1
刚刚安装了Notepad++。再次检查编码,确保为utf8。仍然存在相同的问题。 - curious1
1
这可能是一个很长的尝试,但请尝试完全清除您的浏览器缓存。 - Heatmanofurioso
更改编辑器编码的良好见解。我继承了一个使用ISO-8859-1的遗留网站,切换到UTF-8解决了问题。感谢您的答案! - pbarney
选项2对我有效。在我的情况下,我使用的是MobaXterm,内置编辑器出于某种原因使用了ANSI编码。 - undefined

10

文件保存时使用 Windows-1252 编码(很可能)而不是 UTF-8 编码,导致在浏览器中非 ASCII 字符显示错误的原因是缺乏对 UltraEdit UTF-8 检测的了解,也许还有适当的 UTF-8 配置。

目前最新版本 22.10 的 UltraEdit 如何检测 UTF-8 编码,在用户论坛主题 UTF-8 not recognized, largish file 中有详细说明。该论坛主题还包含有关如何为 HTML 编写者最佳配置 UltraEdit,他们主要使用 UTF-8 编码的所有 HTML 文件的建议。UltraEdit v24.00 大大改进了 UTF-8 检测功能,可以在滚动到包含 UTF-8 编码字符的块时,也能检测到非常大的文件中的 UTF-8 编码字符。

很不幸,目前最新的UltraEdit v22.10和之前的版本使用的正则表达式搜索无法检测到短HTML5变体中的UTF-8 HTML字符集声明,如论坛主题Short UTF-8 charset declaration in HTML5 header所述。原因是在charset=utf-8之间有双引号字符。我通过电子邮件向IDM Computer Solutions, Inc.报告了这个问题,并建议在正则表达式中进行小改动以检测短HTML5 UTF-8声明。后来UltraEdit开发人员更新了UTF-8检测功能,适用于UE v24.00和UES v17.00,详细信息请参见引用论坛主题的帖子。

然而,当HTML5文件被声明为UTF-8编码,但UltraEdit将其作为ANSI文件加载时,用户可以在主窗口底部的状态栏中看到错误的加载。一个小于64 KB的UTF-8编码的HTML文件应该会得到正确的加载。

  • 对于使用UE < v19.00或在后续版本中使用基本状态栏的用户,将显示U8-和行结束符类型(DOS / UNIX / MAC)
  • 对于使用UE v19.00或更高版本但未使用基本状态栏的用户,可以在状态栏中选择UTF-8编码。

如果不是这种情况,UltraEdit用户可以使用

  • 文件菜单中选择另存为,选择编码(Windows Vista或更高版本)或格式(Windows 2000/XP)并选择UTF-8 - NO BOM,将文件从ANSI转换为UTF-8无字节顺序标记,或
  • 文件菜单的子菜单转换中选择ASCII to UTF-8(Unicode editing),将文件从ASCII/ANSI转换为UTF-8而不立即保存,或
  • 通过状态栏中的编码选择器选择Unicode - UTF-8(仅适用于UE v19.00或更高版本),这也会立即将文件从ASCII/ANSI转换为UTF-8并启用Unicode编辑。

对于后两个选项,高级 - 设置配置 - 文件处理 - 保存中的UTF-8 BOM设置决定下一次保存时是否带有字节顺序标记。

一旦使用UTF-8编码将单词méywe保存到文件中,结果是字节流6D C3 A9 79 77 65(十六进制),当在ASCII/ANSI模式下(文件 - 打开对话框中的选项)使用Windows-1252作为代码页打开UTF-8编码文件时,它将显示为méywe。尽管未识别,但UltraEdit会自动检测下次打开此文件时为UTF-8编码文件,因为文件的前64KB中现在至少有一个UTF-8编码字符。
回答问题:
你忘了在将文件声明为UTF-8编码后将其保存为UTF-8编码文件,而是以ANSI文件(或更精确地说是使用代码页的每个字符编码的单字节编码文本文件)打开或创建文件,并将其声明为UTF-8编码。这是许多用户写入HTML文件时的常见问题。
<meta charset="utf-8">

或者

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

或者

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

或者将其转换为XML文件
<?xml version="1.0" encoding="UTF-8"?>

或者

<?xml version="1.0" encoding='utf-8'?>

根据使用'"以及编写UTF-8utf-8(和其他拼写方式)而有所不同的变体,而不真正知道这个字符串对于解释文件字节的应用程序意味着什么。

什么是最佳默认新文件格式? 包含大量有用的信息和链接到有关文本编码的网页,介绍了哪种文件类型应该使用哪种编码以及如何相应地配置UltraEdit。


4

检查并查看服务器在Content-type头中是否发送了charset。在此指定的编码将优先于您使用meta元素指定的编码。


这对我来说是一个线索,在2020年的Chrome检查中,我看到了"Content-Type: text/html; charset=ISO-8859-1"。我只能想象这是一个不支持utf8或其他什么的旧服务器。 - cdsaenz

3

将字体族设置为Calibri(或其他通常接受的字体)对我有用。

示例:

<span style="font-family:Calibri">&#35; My_Text</span>

1

我正在使用MS Access accdb数据库和PHP。在显示"±"字符时出现了问题,它被显示为"�"。我在PHP开头添加了以下行以使其正确显示。现在我的问题已经解决。

    header('Content-type: text/html; charset=ASCII');

另一种方法是使用mb_convert_encoding($row,'UTF-8','ASCII' ); 不需要头声明。

0
在我的情况下,我将特殊字符转换为十进制NCR,这样就可以工作了。我不得不这样做是因为使用元标记不起作用,而且我不想更改我的字体。
有很多在线unicode到十进制或十六进制转换器。
Χαίρετε -> &#935;&#945;&#943;&#961;&#949;&#964;&#949;

-3

meta charset="utf-8" 替换为 meta http-equiv="Content-Type" content="text/html; charset=utf-8"。也许会有帮助。

否则,你的字体是什么?


不,当前的字符集声明是有效的HTML5,并被所有浏览器识别。 - Konrad Rudolph
1
之前尝试过这个解决方案,现在又重新尝试了一遍,但都无法生效。 - curious1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接