我试图从PHP字符串中的字符中删除重音符号作为使字符串在URL中可用的第一步.
我正在使用以下代码:
$input = "Fóø Bår";
setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);
print($output);
Run Code Online (Sandbox Code Playgroud)
我期望的输出将是这样的:
F'oo Bar
Run Code Online (Sandbox Code Playgroud)
但是,不是重音字符被音译,而是用问号代替:
F?? B?r
Run Code Online (Sandbox Code Playgroud)
我在网上找到的所有内容都表明设置语言环境将解决这个问题,但我已经这样做了.我已经检查了以下细节:
locale -a)iconv -l)mb_check_encoding函数验证,如mercator的答案中所建议的那样)setlocale成功(返回'en_US.utf8'而不是FALSE)服务器正在使用iconv的错误实现.它有glibc版本而不是所需的libiconv版本.
请注意,某些系统上的iconv功能可能无法正常工作.在这种情况下,安装GNU libiconv库是个好主意.它最有可能最终得到更一致的结果.
- PHP手册对iconv的介绍
有关PHP使用的iconv实现的详细信息包含在phpinfo函数的输出中.
(我无法使用正在为此项目工作的服务器上的正确iconv库重新编译PHP,因此下面我接受的答案是在没有iconv支持的情况下删除重音的最有用的答案.)
我正在尝试将一堆文件从US-ASCII转码为UTF-8.
为此,我正在使用iconv:
iconv -f US-ASCII -t UTF-8 file.php > file-utf8.php
Run Code Online (Sandbox Code Playgroud)
事情是我的原始文件是US-ASCII编码,这使得转换不会发生.显然它会发生因为ASCII是UTF-8的一个子集......
引用:
在引入非ascii字符之前,不需要显示文本文件
真正.如果我在文件中引入非ASCII字符并保存它,那么假设使用Eclipse,文件编码(charset)将切换为UTF-8.
在我的情况下,我想强制iconv将文件转码为UTF-8.是否存在非ASCII字符.
注意:原因是我的PHP代码(非ASCII文件...)正在处理一些非ASCII字符串,这导致字符串不能很好地解释(法语):
Ilétait une fois ... l'hommesé©animéemythique d'Albert
Barillé(Procidis),1?
...
编辑
US-ASCII- 是 - 的一部分UTF-8(见下面Ned的回答)US-ASCII文件是在实际编码UTF-8我想要做的是从字符串中删除所有重音符号和变音符号,将"lärm"变为"larm"或将"andré"变为"andre".我试图做的是utf8_decode字符串,然后使用strtr,但由于我的源文件保存为UTF-8文件,我不能输入所有变音符号的ISO-8859-15字符 - 编辑器插入UTF-8字符.
显然,一个解决方案是拥有一个ISO-8859-15文件的包含,但必须有一个更好的方法,而不是另一个必需的包含?
echo strtr(utf8_decode($input),
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
Run Code Online (Sandbox Code Playgroud)
更新:也许我尝试做的事情有点不准确:我实际上并不想删除变音符号,而是将它们替换为最接近的"单字符ASCII"等价物.
有没有什么好的解决方案以良好的方式进行这种音译?
我尝试过使用iconv(),但是非常烦人,而且它的行为并不像人们预期的那样.
//TRANSLIT将尝试替换它可能的东西,将所有不可转换的东西留作"?" //IGNORE不会留下"?" 在文本中,但也不会音译,并且E_NOTICE当找到不可转换的字符时也会引发,所以你必须使用带有@ error suppressor的iconv//IGNORE//TRANSLIT(正如一些人在PHP论坛中建议的)实际上是相同的//IGNORE(在php版本5.3.2和5.3.13上自己尝试过)//TRANSLIT//IGNORE与...相同//TRANSLIT它还使用当前区域设置进行音译.
警告 - 许多文本和代码如下!
这里有些例子:
$text = 'Regular ascii text + ??žš? + äöüß + é???ë? + æø€ + $ + ¶ + @';
echo '<br />original: ' . $text;
echo '<br />regular: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> regular: Regular ascii text + ????? + ???ss + ?????? + ae?EUR + $ + ? + …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个方法或转换表,知道如何将变音符号和特殊字符转换为ascii中最可能的表示形式.
例:
Ärger = aerger
Bôhme = bohme
Søren = soeren
pjérà = pjera
Run Code Online (Sandbox Code Playgroud)
有人有什么想法?
更新:除了良好的接受答案,我还发现PECLs Normalizer非常有趣,虽然我不能使用它,因为服务器没有它并且没有为我更改.
如果此处的答案对您没有帮助,请查看此问题.
php ascii diacritics special-characters non-ascii-characters
为了索引和搜索的目的,我需要“展平”一些 Unicode 字符串。例如,我需要转换G\xc3\xb6the\xd0\xa4\xe2\x82\xac为 ASCII。最后两个字符在 ASCII 中没有紧密的表示,因此可以完全丢弃它们。所以我的期望是
echo iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", "G\xc3\xb6the\xd0\xa4\xe2\x82\xac");\nRun Code Online (Sandbox Code Playgroud)\n\n是Gothe,但它输出Gothe?EUR.
除了字母之外,我还希望将所有各种 Unicode 数字和标点符号(例如句号、逗号、破折号、斜杠等)替换为最接近的 ASCII 对应项,这在ASCII//TRANSLIT//IGNORE函数中已经做到了,iconv但还没有不会为无法找到任何 ASCII 替换的 Unicode 字符生成一些垃圾输出。我希望这些角色被完全忽略。
如何得到预期的结果?有没有更好的方法,也许使用intl库?