Php str_replace无法使用特殊字符

时间:2014-08-23 18:32:16

标签: php utf-8 character-encoding internationalization

为什么这不按预期工作:

 echo str_replace("é","é","Fédération Camerounaise de Football");

结果:

"Fédération Camerounaise de Football"

我希望有:

"Fédération Camerounaise de Football"

3 个答案:

答案 0 :(得分:7)

你做错了。这个字符串不正确,需要替换,只需用UTF-8编码。

您所要做的只是utf8_decode('Fédération Camerounaise de Football')

更新

您看到Fédération Camerounaise de Football为输出,因为您在UTF-8中双重传递数据。

观察:

file1.php以UTF-8格式保存:

<?php
    echo "Fédération Camerounaise de Football";

输出:

  
    

FédérationCasrounaise de Football

  

现在,如果您告诉浏览器您使用的是UTF-8,它应该直接显示内容:

file2.php以UTF-8格式保存:

<?php
    header('Content-Type: text/html; charset=utf-8');
    echo "Fédération Camerounaise de Football";

输出:

  
    

FédérationCasrounaisede Football

  

完美。

然而,你做得更糟。您有一个UTF-8编码的字符串,并通过将其写入UTF-8编码文件再次对其进行编码。

file3.php以UTF-8格式保存:

<?php
    echo "Fédération Camerounaise de Football";

输出:

  
    

Fédération Camerounaise de Football

  
真是一团糟。让我们看看我们是否可以使用str_replace

来解决这个问题

file4.php以UTF-8格式保存:

<?php
    echo str_replace("é","é","Fédération Camerounaise de Football");

输出:

  
    

FédérationCasrounaise de Football

  

如您所见,我们“修复”了它。有点。 这就是你在做什么。你正在将é转换为é,即使你没有看到这个,因为你的编辑器不会让你看到编码背后的真实符号,但浏览器确实

让我们再次尝试使用ASCII:

file5.php以ASCII格式保存:

<?php
    echo str_replace("é","é","Fédération Camerounaise de Football");

输出:

  
    

FédérationCasrounaisede Football

  

魔术!浏览器现在就搞定了一切。但是真正的解决方案是什么?好。如果你的PHP文件中有一个字符串硬编码,那么你应该简单地写Fédération Camerounaise de Football而不是把该死的东西放错。但是如果你从另一个文件或数据库中获取它,你应该选择以下两个课程之一:

  1. 使用utf8_decode()将您提取的数据转换为所需的输出。

  2. 请勿转换任何内容,并使用header('Content-Type: text/html; charset=utf-8');告诉浏览器您正在以UTF-8格式打印内容,以便正确显示内容。

答案 1 :(得分:1)

//在评论后编辑

Fédération Camerounaise de FootballUTF-8编码的字符串,因此我不知道您的文档中的utf-8编码输入是什么,但您有两种选择。

  1. 传递给str_replace的输入为utf-8,但您在要替换的函数中使用的字符为ANSII或其他=&gt;不起作用 - 这意味着您的文档不是utf-8 - 这就是uft8_decode有效的原因 str_replace(ANSII, ANSII, CONVERT_TO_ANSII(UTF-8))

  2. 您的输入不是utf-8而您的文档是 - 所以这可行 str_replace(UTF-8, UTF-8, CONVERT_TO_UTF-8(ANSII))


  3. str_replace适用于多字节字符 - 您的问题不是它的功能,因为您尝试替换不同的编码类型。而不是使用替代功能 - 我建议您修改传递给str_replaceutf-8的输入,并确保您的文档也被utf-8编码。

    如果您的来源仅支持非utf-8编码,请使用utf8_encode将您的输入转换为utf-8

    http://php.net/manual/de/function.utf8-encode.php

答案 2 :(得分:-4)

检查以下代码:

$chain="Fédération Camerounaise de Football";
$pattern = array("'é'");
$replace = array('é'); 
$chain = preg_replace($pattern, $replace, $chain);
echo $chain;