相关疑难解决方法(0)

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

我试图从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)

我在网上找到的所有内容都表明设置语言环境将解决这个问题,但我已经这样做了.我已经检查了以下细节:

  1. 我正在设置的语言环境由服务器支持(包含在生成的列表中locale -a)
  2. 服务器的iconv版本(包括在生成的列表中)支持源和目标编码(UTF-8和ASCII iconv -l)
  3. 输入字符串是UTF-8编码的(使用PHP mb_check_encoding函数验证,如mercator答案中所建议的那样)
  4. 呼叫setlocale成功(返回'en_US.utf8'而不是FALSE)

问题的原因:

服务器正在使用iconv的错误实现.它有glibc版本而不是所需的libiconv版本.

请注意,某些系统上的iconv功能可能无法正常工作.在这种情况下,安装GNU libiconv库是个好主意.它最有可能最终得到更一致的结果.
- PHP手册对iconv的介绍

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

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

php iconv

81
推荐指数
10
解决办法
12万
查看次数

强制编码从US-ASCII到UTF-8(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的一个子集......

http://www.linuxquestions.org/questions/linux-software-2/iconv-us-ascii-to-utf-8-or-iso-8859-15-a-705054/

引用:

在引入非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
  • 我的问题来自其他地方

utf-8 character-encoding iconv

55
推荐指数
4
解决办法
15万
查看次数

PHP:用UTF-8字符串中最接近7位ASCII等效的变音符号替换

我想要做的是从字符串中删除所有重音符号和变音符号,将"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"等价物.

php utf-8 diacritics strtr

44
推荐指数
3
解决办法
4万
查看次数

将任何可转换的utf8字符音译为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)

php ascii utf-8 transliteration iconv

20
推荐指数
2
解决办法
2万
查看次数

将特殊字符(即Umlaut)转换为ascii中最可能的表示形式

我正在寻找一个方法或转换表,知道如何将变音符号和特殊字符转换为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

8
推荐指数
1
解决办法
1万
查看次数

6
推荐指数
1
解决办法
5126
查看次数

将 Unicode 字符转换为等效的 ASCII 字符

为了索引和搜索的目的,我需要“展平”一些 Unicode 字符串。例如,我需要转换G\xc3\xb6the\xd0\xa4\xe2\x82\xac为 ASCII。最后两个字符在 ASCII 中没有紧密的表示,因此可以完全丢弃它们。所以我的期望是

\n\n
echo iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", "G\xc3\xb6the\xd0\xa4\xe2\x82\xac");\n
Run Code Online (Sandbox Code Playgroud)\n\n

Gothe,但它输出Gothe?EUR.

\n\n

除了字母之外,我还希望将所有各种 Unicode 数字和标点符号(例如句号、逗号、破折号、斜杠等)替换为最接近的 ASCII 对应项,这在ASCII//TRANSLIT//IGNORE函数中已经做到了,iconv但还没有不会为无法找到任何 ASCII 替换的 Unicode 字符生成一些垃圾输出。我希望这些角色被完全忽略。

\n\n

如何得到预期的结果?有没有更好的方法,也许使用intl库?

\n

php unicode transliteration character-encoding iconv

5
推荐指数
1
解决办法
9102
查看次数