用Umlaute取代德国字符到简单的拉丁字符php

时间:2017-01-05 01:27:26

标签: php symfony

我正在使用symfony和简单的直接代码试图将任何特殊字符更改为A o O u U.我尝试了所有我能找到的内容

归一化

echo \Normalizer::normalize("ä");

的htmlspecialchars

echo htmlspecialchars("ä");

和其他一些解决方案一样,这些在线发现,但它们都不适合我,所有人都会输出

ä

而不是

a

不仅与ä相关,而且还包括我之前提到的所有其他字符。

我做错了什么?还是有其他解决方案可以做到这一点。

3 个答案:

答案 0 :(得分:0)

这样的替换是错误的,因为它会产生错误的单词(相当多的德语单词仅因变音符号的存在而不同......你甚至可以获得一些NSFW结果......)。有替代变音符号的标准官方规则:

  • ä→ae
  • ö→oe
  • ü→ue
  • Ä→Ae
  • Ö→Oe
  • Ü→Ue
  • ß→ss(或SZ for capital)

您的示例中的Normalizer :: normalize(normalizer_normalize)最初来自java,而PHP仅支持某些版本。您是否意识到在脚本代码中输入了Unicode字符?有手册的例子:

<?php
$char_A_ring = "\xC3\x85"; // 'LATIN CAPITAL LETTER A WITH RING ABOVE' (U+00C5)
$char_combining_ring_above = "\xCC\x8A";  // 'COMBINING RING ABOVE' (U+030A)

$char_1 = Normalizer::normalize( $char_A_ring, Normalizer::FORM_C );
$char_2 = Normalizer::normalize( 'A' . $char_combining_ring_above, Normalizer::FORM_C );

echo urlencode($char_1);
echo ' ';
echo urlencode($char_2);
?> 

(来自http://php.net/manual/en/normalizer.normalize.php

答案 1 :(得分:0)

这个对我有用,可供进一步参考

$inputString = "Á,Â,Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,×,Ù,Ú,Û,Ü,Ý,Þ,ß,à,á,â,ã,ä,å,æ,ç,è,é,ê,ë,ì,í,î,ï,ð,ñ,ò,ó,ô,õ,ö,ù,ú,û,ü,ý,þ,ÿ";
$extraCharsToRemove = array("\"","'","`","^","~");
echo str_replace($extraCharsToRemove,"",iconv("utf-8","ASCII//TRANSLIT",$inputString));

输出将是

A,A,A,A,A,AE,C,E,E,E,E,I,I,I,I,D,N,O,O,O,O,O,x,U,U,U,U,Y,Th,ss,a,a,a,a,a,a,ae,c,e,e,e,e,i,i,i,i,d,n,o,o,o,o,o,u,u,u,u,y,th,y

检查iconv以获取更多信息

答案 2 :(得分:0)

我猜你想要的是将一个字符串 transliterate - 无论它可能包含哪些特殊字符 - 到一个只包含 ASCII 编码字符的字符串。

即使您使用 PHP 的 NormalizerTransliteratorext-iconv(如其他答案所说),这也可能很复杂。

我使用 symfony/string(2019 年的第一个 released)为您完成所有这些:

use Symfony\Component\String\UnicodeString;

$myString = new UnicodeString('Ä ö Ö ü Ü');

echo $myString->ascii(); // 'A o O u U'