【问题标题】:é and é have different ASCII valuesé 和 é 具有不同的 ASCII 值
【发布时间】:2019-11-01 10:54:24
【问题描述】:

我正在使用 htmlentities 转换特殊字符,但我遇到了 2 种不同类型的 é

<?php
header('Content-Type: text/html; charset=utf-8');
echo htmlentities("é")."\n";
echo htmlentities("é")."\n";
?>

输出:

é
&eacute;

我使用这个输出了 ASCII 值

echo ord("é");
echo ord("é");

输出

101
195

有没有办法强制 htmlentities 将 e 转换为可用字符?

【问题讨论】:

  • 什么是可用字符? Unicode 有多种显示重音字符的方式
  • 如何在输入上添加一个str_replace("é", "é", $string); 以使所有 相同?
  • 实际 ASCII 甚至不包含字符 é。 ASCII 中的 101 只是 e - 对于任何大于 127 的内容,我们实际上甚至不再谈论 ASCII,而更有可能是 ISO 8859-xy 编码之一。您实际使用的字符编码(使用此数据,以及您输出它的页面)是您应该首先在此处添加的信息。
  • ord 只查看您输入的任何输入值的第一个 byte。因此,如果ord("é") 结果为您提供 101,那么您很可能有一个实际的 e,它与某种 Unicode 编码形式的重音组合
  • 因为 ord 只看第一个字节,你可以使用ord("é"[1])ord("é"[2]) 来检查第二个和第三个字节的值是什么(如果它们存在,如果这实际上被编码为三个字节。)这可能会给你101 204 129,这意味着这是基本拉丁字符e(U+0065)的UTF-8表示,后跟U+0301,COMBINING ACUTE口音

标签: php character-encoding ascii


【解决方案1】:

我们这里有 2 个不同的 UTF-8 字符串。

<?php
var_dump("é" === "e\u{301}");
var_dump("é" === "\u{e9}");
//bool(true) bool(true)

尝试自我:https://3v4l.org/QnHvg

第一个字符串包含 2 个字符,ASCII "e" 和 unicode U+0301。 第二个字符串包含字符U+00E9

字符串可以很容易地用 str_replace 替换。建议使用 unicode 表示法(PHP 7+)以避免误解。

$string = str_replace("e\u{301}","\u{e9}",$string);

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多