【问题标题】:strtr acting weird - removing diacritics from a stringstrtr 行为怪异 - 从字符串中删除变音符号
【发布时间】:2015-04-04 17:10:56
【问题描述】:

我很难从一些 $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 可能有一些用处(基于函数),或this
  • this ("multibyte strtr() -> mb_strtr()")
  • 感谢您的建议,我肯定会决定使用其中之一,但我仍然期待了解为什么我的代码无法正常工作。
  • @Martin.,可能是因为其中一些字符超过一个字节,所以它没有正确映射。阅读this 评论,并尝试使用关联数组来代替

标签: php strtr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    一个简单且经过尝试的解决方案(基于 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 中所述。

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

    【讨论】:

    • 不幸的是,由于某种原因,这个解决方案给了我P??li? ?lu?ou?k? k?? ?p?l ??belsk? ?dy.。是否需要设置一些内部 PHP 设置?
    • 您使用的是什么 PHP 版本,您的 .php 文件是什么文档编码?
    • 它是 UTF-8 编码的,没有 BOM。 PHP 版本 5.4.36-1
    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 2015-08-30
    • 2010-09-19
    • 2012-12-10
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多