strtr() 部分不起作用

strtr() partially not work

我构建了一个脚本来为我的项目生成站点地图。

此脚本使用 strtr() 替换不需要的符号并转换德语变音符号。

    $ers = array( '<' => '', '>' => '', ' ' => '-',  'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', '&' => 'und', '*' => '', ' - ' => '-', ',' => '', '.' => '', '!' => '', '?' => '' );
foreach ($rs_post as $row) { 
  $kategorie = $row['category'];
  $kategorie = strtr($kategorie,$ers);
  $kategorie = strtolower($kategorie);
  $kategorie = trim($kategorie);
  $org_file .= "<url><loc>https://domain.org/kategorie/" . $kategorie . "/</loc><lastmod>2016-08-18T19:02:42+00:00</lastmod><changefreq>monthly</changefreq><priority>0.2</priority></url>" . PHP_EOL;
}

像“<”这样不需要的符号将被正确替换,但德语变音符号不会被转换。我不知道为什么。

有人给我小费吗?

托斯滕

检查字符集。 如果您的发送表单页面使用:

<meta charset="utf-8"> 

将不起作用。

尝试使用其他编码,例如

<meta charset="ISO-8859-1">

下面是用于测试替换数组的小示例代码:

<!DOCTYPE html>
<html>
<?php
if(isset($_POST["txt"])) 
{   
    echo '<head><meta charset="ISO-8859-1"></head><body>';

    $posted = $_POST["txt"]; 
    echo 'Received raw: ' . $posted .'<br/>';
    echo 'Received: ' . htmlspecialchars($posted).'<br/>';; 

    $ers = array( '<' => '', '>' => '', ' ' => '-',  'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', '&' => 'und', '*' => '', ' - ' => '-', ',' => '', '.' => '', '!' => '', '?' => '' );

    $replaced = strtr($posted,$ers);   
    echo 'Replaced: ' . $replaced .'<br/>';  
}
else {
    ?>  
<head>
    <!--<meta charset="utf-8">--> <!--THIS ENCODING WILL NOT WORK -->
     <meta charset="ISO-8859-1">  <!--THIS WORKS FINE -->
</head>
<body> 
  <p>the text you want to replace here</p>
  <form action="#" method="post">
  Text: <input type="text" name="txt" value="">
  <input type="submit" value="Submit">
</form>

<?php   
}
?>  
</body>
</html>

正如其他人指出的那样,最可能的原因是字符编码不匹配。由于您尝试转换的标题显然是 UTF-8,问题很可能是您的 PHP 源代码 不是 。尝试 re-saving 将文件作为 UTF-8 文本,看看是否能解决问题。

顺便说一句,一个简单的调试方法是将数据行和音译数组打印到同一个输出文件中,例如使用print_r() or var_dump(),然后查看输出以查看其中的 non-ASCII 个字符是否正确。如果字符在数据中看起来是正确的,但在音译中是错误的 table(反之亦然),则表示编码不匹配。

Ps。如果你有 PHP iconv extension installed (and you probably do), consider using it to automatically convert your titles to ASCII.