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

时间:2017-02-01 21:40:08

标签: php utf-8 format

当PHP从FTP文件夹输出文件名时,它会产生3个字符长的法语字符,所以当我们var_dump:

var_dump("é");

它显示:

string(3)

但实际角色应该是

string(2)

使用Wordpress功能拉取文件名

当它是字符串(3)时,我们不能对其执行preg_match以用标准ASCII字符替换它。

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

header('Content-Type: text/html; charset=iso-8859-1');

但结果是乱码。

我们还有什么可以尝试的吗?它是一个什么样的角色?

1 个答案:

答案 0 :(得分:2)

你的角色实际上是0x65cc81,而不是UTF-8 0xc3a9中更常见的单一Unicode码点(é带有急性的LATIN小写字母E(U + 00E9))。 0x65cc81是Unicode“组合序列”:0x65e“LATIN SMALL LETTER E”(U + 0065),0xcc81是“组合急切加速”(U + 0301)”。

您可以使用PHP的Normalizer

将组合序列转换为单个代码点
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"