PHP iconv() 将 "ä"转换为 "ae"但它应该是 "a"

标签 php linux locale translation iconv

所以,长期以来,我一直使用 iconv() 来生成 URL 安全(以及在其他上下文中)版本的瑞典语单词,所以单词 Stadsnät 变成了 Stadsnat 但我刚搬到一个新的服务器,并注意到它被翻译成 Stadsnaet 而不是,破坏了很多链接,我如何让 iconv() 返回到"dumber"ä -> a 而不是可能更正确的 ä -> ae

它似乎不是 PHP 的函数,在我的开发服务器上它被正确转换,但在我的生产服务器上没有正确转换,并且两者都使用相同的 setlocale() 但我猜系统中的语言环境文件可能不同。

有什么想法吗?

最佳答案

我猜你没有正确指定 setLocale。

通过这个小例子,您可以看到不同之处:

<?php
$str = 'Stadsnät';

setlocale(LC_ALL, 'en_GB');
$translit = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
echo $translit . PHP_EOL;
// echos Stadsnat


setlocale(LC_ALL, 'de_CH');
$translit = iconv('UTF-8', 'ASCII//TRANSLIT', $str);

echo $translit . PHP_EOL;
// echos Stadsnaet

在两台服务器上尝试这个小脚本以确保安全。

编辑:

根据评论中的对话: setLocale(LC_ALL, 'en_US.UTF8') 解决了这个问题。

作为替代,下面的代码应该做同样的事情:

transliterator_transliterate('Any-Latin; Latin-ASCII; [\u0080-\uffff] remove', 'Stadsnät')

关于PHP iconv() 将 "ä"转换为 "ae"但它应该是 "a",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57679091/

相关文章:

linux - 如何让 Bash 循环休眠几秒钟?

jsp - 如何从 JSP 访问 Locale?

linux - 仅在尚未运行时运行 cron 作业

locale - symfony2 根据域名检测语言环境

java Locale.Builder setExtension(Locale.UNICODE_LOCALE_EXTENSION

php - [INFO]没有电商CMS的个人网站支付方式

php - 如何检查时间是否在给定的时间间隔范围内

php - 调用子目录中的页面模板

php - Mysql连接3个具有多个字段的表

Python 多处理 : more processes than requested