【问题标题】:Php str_replace not working with special charsphp str_replace 不使用特殊字符
【发布时间】:2014-08-23 18:32:16
【问题描述】:

为什么没有按预期工作:

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

结果:

"Fédération Camerounaise de Football"

我希望有:

"Fédération Camerounaise de Football"

【问题讨论】:

  • 这里的问题是字符编码,而不是str_replace()...
  • @Cobra_Fast 好的,我该怎么办?
  • 我认为这是一个多字节问题,在这种情况下尝试使用mb_ereg_replace()mb_ereg_replace()
  • 正确设置你的东西(我怀疑你有一个 UTF-8 数据库连接和 ISO-8859/latin 输出)或搞乱utf8_decode()mb_convert_encoding()或@987654331 @.
  • @Cobra_Fast 我不使用任何数据库,它是一行代码:echo str_replace("é","é","Fédération Camerounaise de Football");跨度>

标签: php utf-8 character-encoding internationalization


【解决方案1】:

你做错了。这个字符串不是错误的,需要替换,它只是用 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ération Camerounaise de Football

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

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

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

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

让我们用 ASCII 再试一次:

file5.php 以 ASCII 格式保存:

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

输出:

喀麦隆足球联合会

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

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

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

【讨论】:

  • str_replace("é","é",utf8_decode('Fédération Camerounaise de Football')) 不工作
  • 不,伙计。根本不要使用str_replace
  • 如果您像这样在 PHP 文件中硬编码字符串,您可能会让事情变得更糟。该文件本身可能也以 UTF-8 编码,因此这些都不起作用。如果你想看看这里到底发生了什么,请将其保存为 ASCII。
  • 如果您使用 PHP 生成 HTML,您应该坚持使用 UTF-8 并使用您的 HTML 标头发送 &lt;meta charset="utf-8"&gt;。请记住如果这样做,您根本不需要对这个字符串进行任何“修复”
【解决方案2】:

//评论后编辑

Fédération Camerounaise de Football 是一个UTF-8 编码字符串,所以我不知道您的文档中哪些输入不是utf-8 编码的,但您有两个选择。

  1. 您传递给str_replace 的输入是utf-8,但您在要替换的函数中使用的字符是ANSII 或其他=> 不起作用 - 这意味着您的文档不是@ 987654328@ - 这就是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))


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

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

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

【讨论】:

  • @RachidO。我解释了我的答案
  • str_replace("é","é",utf8_encode('Fédération Camerounaise de Football')) 结果是“Fédération Camerounaise de Football "
  • 老兄,你的字符串只是被编码了两次,只要使用echo utf8_decode(utf8_decode('Fédération Camerounaise de Football'));你就会看到它。
  • @Havenard 你能把它作为答案让我接受吗?
【解决方案3】:

检查以下代码:

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

【讨论】:

  • 它给了我“FAdAration Camerounaise de Football”
  • 您的预期结果是什么?
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多