strtr表现得很奇怪 - 从字符串中删除变音符号

时间:2015-02-05 00:04:58

标签: php strtr

我很难从某些$string中删除变音符号。我的代码是

<?php
$string = "Příliš žluťoučký kůň úpěl ďábelské ódy.";
$without_diacritics = strTr($string, "říšžťčýůúěďó", "risztcyuuedo");
echo $without_diacritics; 

预期输出为Prilis zlutoucky kun upel dabelske ody.

相反,我收到了非常奇怪的回应:

Puiszliuc uuluueoudoks� ku�u� s�pd�l d�scbelsks� s�dy.

我认为这可能是多字节字符的问题,但我发现strtr是多字节安全的。我的假设错了吗?我错过了什么?

2 个答案:

答案 0 :(得分:4)

问题是您的输入翻译字符串是输出翻译字符串的两倍(因为Unicode),strtr()使用字节而不是字符;在这种情况下,翻译数组会更好:

$string = "Příliš žluťoučký kůň úpěl ďábelské ódy.";

echo strtr($string, [
  'ř' => 'r',
  'í' => 'i',
  'š' => 's',
  'ž' => 'z',
  'ť' => 't',
  'č' => 'c',
  'ý' => 'y',
  'ů' => 'u',
  'ú' => 'u',
  'ě' => 'e',
  'ď' => 'd',
  'ó' => 'o'
]);

输出:

Prilis zlutoucky kuň upel dábelské ody.

Demo

答案 1 :(得分:1)

一个简单且经过尝试的解决方案(基于this answer),利用iconv()将字符串“从您给定的编码转换为ASCII字符”。

$input = 'Příliš žluťoučký kůň úpěl ďábelské ódy.';
$input = iconv('UTF-8', 'ASCII//TRANSLIT', $input);
echo $input;

Example


解释

您面临的问题是由于字符串/文档的编码。 strtr()的问题在于它不是多字节意识的,正如@ChrisForrence在comment中所述。

  

可能是因为其中一些字符不止一个字节,所以   它没有正确映射。