strtr 行为怪异 - 从字符串中删除变音符号

strtr acting weird - removing diacritics from a string

我很难从某些 $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 是多字节安全的。我的假设错了吗?我错过了什么?

一个简单且经过尝试的解决方案(基于 this answer), harnesses iconv() 来转换字符串 "from your given encoding to ASCII characters"。

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

Example


说明

您遇到的问题是由 string/document 的编码引起的。 strtr() 的问题在于它不支持多字节,正如@ChrisForrence 在他的 .

中所述

It may be because some of those characters are more than one byte, so it doesn't map properly.

问题是您的输入翻译字符串是输出翻译字符串的两倍(因为 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