一尘不染

如何从PHP字符串中的字符中删除重音符号?

php

我正在尝试从PHP字符串中的字符中删除重音符号,作为使字符串在URL中可用的第一步。

我正在使用以下代码:

$input = "Fóø Bår";

setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);

print($output);

我期望的输出将是这样的:

F'oo Bar

但是,不是将重音字符音译,而是将它们替换为问号:

F?? B?r

我在网上可以找到的所有内容都表明,设置语言环境将解决此问题,但是我已经这样做了。我已经检查了以下详细信息:

  1. 服务器支持我设置的语言环境(包含在产生的列表中locale -a
  2. 服务器的iconv版本(包含在产生的列表中)支持源编码和目标编码(UTF-8和ASCII iconv -l)。
  3. 输入字符串是UTF-8编码的(使用PHP mb_check_encoding函数进行了验证
  4. 的调用setlocale成功(返回'en_US.utf8'而不是FALSE

问题原因:

服务器正在使用错误的iconv实现。它具有 glibc 版本,而不是必需的 libiconv 版本。

请注意,某些系统上的iconv功能可能无法按预期工作。在这种情况下,最好安装GNU libiconv库。最终可能会得到更一致的结果。
PHP手册对iconv的介绍

phpinfo函数的输出中包含有关PHP使用的iconv实现的详细信息。

(我无法在与此项目一起使用的服务器上使用正确的iconv库重新编译PHP,因此下面我接受的答案是在没有iconv支持的情况下删除重音符号的最有用的答案。)


阅读 262

收藏
2020-05-26

共1个答案

一尘不染

我认为这里的问题是您的编码将ä和å的符号视为与’a’不同。实际上,strtr的PHP文档提供了一个以难看的方式消除重音的示例

2020-05-26