PHP输出一个奇怪的法语字符é;=字符串(3)

PHP输出一个奇怪的法语字符é;=字符串(3),php,utf-8,format,Php,Utf 8,Format,当PHP从FTP文件夹输出文件名时,它会生成3个字符长的法语字符,因此当我们使用var_dump时: var_dump("é"); 它表明: string(3) 但实际角色应该是 string(2) 使用Wordpress函数提取文件名 当它是字符串(3)时,我们不能对它进行preg_匹配以用标准ASCII字符替换它 我尝试将格式声明为UTF-8,但它已经是UTF-8了。也试过 header('Content-Type: text/html; charset=iso-8859-1');

当PHP从FTP文件夹输出文件名时,它会生成3个字符长的法语字符,因此当我们使用var_dump时:

var_dump("é");
它表明:

string(3)
但实际角色应该是

string(2)
使用Wordpress函数提取文件名

当它是字符串(3)时,我们不能对它进行preg_匹配以用标准ASCII字符替换它

我尝试将格式声明为UTF-8,但它已经是UTF-8了。也试过

header('Content-Type: text/html; charset=iso-8859-1');
但结果是文本乱码


还有什么我们可以试试的吗?它是什么类型的字符?

您的字符
实际上是
0x65cc81
,而不是UTF-8
0xc3a9
é
带锐音符的拉丁文小写字母e(U+00E9))
0x65cc81
是一种Unicode“组合序列”:
0x65
e
“拉丁字母e”(U+0065)和
0xcc81
是́“组合尖锐重音(U+0301)”

可以使用PHP将组合序列转换为单个代码点:

给予


您的字符
实际上是
0x65cc81
,而不是UTF-8
0xc3a9
中更常见的单个Unicode码点(
e
带锐音符的拉丁文小写字母e(U+00E9))
0x65cc81
是一种Unicode“组合序列”:
0x65
e
“拉丁字母e”(U+0065)和
0xcc81
是́“组合尖锐重音(U+0301)”

可以使用PHP将组合序列转换为单个代码点:

给予


这听起来非常类似于确保使用htmlspecialchars将文件名包装在echo中-
string(1)
是一个1字节的字符串;UTF-8是一个多字节字符集,因此1个字符不等于1个字节。它的可能重复项看起来不像是一个UTF-8
é
:这听起来非常类似,以确保在回音中使用htmlspecialchars包装文件名-
字符串(1)
是一个1字节字符串;UTF-8是一个多字节字符集,因此1个字符不等于1个字节。它的可能副本看起来不像您有一个UTF-8
é
:这工作得很好,谢谢您的时间标记!我们可以在包含特殊字符的整个字符串上运行它,而不仅仅是单个字符。对于那些阅读它的人,只需使用Mark的$character=Normalizer::normalize($character);它会将它们转换为普通的单代码点。这工作非常漂亮,谢谢你的时间标记!我们可以在包含特殊字符的整个字符串上运行它,而不仅仅是单个字符。对于那些阅读它的人,只需使用Mark的$character=Normalizer::normalize($character);它将把它们转换成普通的单代码点
function strhex($string) {
  $hexstr = unpack('H*', $string);
  return array_shift($hexstr);
}

$character = "é";
var_dump($character);
var_dump(strhex($character));

$character = Normalizer::normalize($character);

var_dump($character);
var_dump(strhex($character));
string(3) "é"
string(6) "65cc81"
string(2) "é"
string(4) "c3a9"