質問

私はPHPでアクセント文字の置換を行うが、私はUTF-8文字列を使用していますし、str_replaceが正しく..

マルチバイト文字列を扱うことができないので、私の推測がされてファンキーな結果を取得しようとしています
$accents_search     = array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'); 

$accents_replace    = array('a','a','a','a','a','a','a','A','A','A','A','A','e','e',
'e','e','E','E','E','E','i','i','i','i','I','I','I','I','oe','o','o','o','o','o','o',
'O','O','O','O','O','u','u','u','U','U','U','c','C','N','n'); 

$str = str_replace($accents_search, $accents_replace, $str);
私が手

結果:

Ørjan Nilsen -> �orjan Nilsen

期待される結果:

Ørjan Nilsen -> Orjan Nilsen

編集:私はUTF-8に設定私の内部文字ハンドラを持っている()(mb_internal_encodingによる)、また、$ strの値はUTF-8であるので、私が言うことができるものと、関係するすべての文字列がUTFあります-8。 str_replace()文字セットを検出し、適切にそれらを使用していますか?

役に立ちましたか?

解決

文字列が交換されていなかったように

が見えるので、あなたの入力エンコーディングやファイルのエンコーディングの不一致ます。

他のヒント

PHPのマニュアルによれば、 str_replace の機能は、そのバイナリデータに対応してそれはどのようなデータを失うことなくUTF-8エンコードされたテキストを処理できることを意味します。

これはユニコード正規形D の(NFD)とUnicode文字を使用して、特殊記号を除去することが可能ですプロパティます。

NFDは、(文字)「分音符号付きラテン小文字U」から「U」ウムラウトのような「ラテン小文字U」(文字)および「を組み合わせる分音符号」(ない文字)に変換します。

header('Content-Type: text/plain; charset=utf-8');

$test = implode('', array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'));

$test = Normalizer::normalize($test, Normalizer::FORM_D);

// Remove everything that's not a "letter" or a space (e.g. diacritics)
// (see http://de2.php.net/manual/en/regexp.reference.unicode.php)
$pattern = '/[^\pL ]/u';

echo preg_replace($pattern, '', $test);

出力:

aaaaªaaAAAAAeeeeEEEEiiiiIIIIœooooºøØOOOOuuuUUUcCNn

ノーマライザークラスは PECLの国際パッケージでの一部です。 (アルゴリズム自体は非常に複雑ではないですが、私の知る限り、文字マッピングの多くをロードする必要がある。私は<のhref = "http://code.google.com/p/dockyard/source/browse/trunk/php/を書きましたutf8normalizer /」のrel = "nofollowをnoreferrer">しばらく前のPHP実装。)

(私はそれが広く十分に知られていない素敵な技術だと思うので、私はこの2ヶ月遅れて追加している。)

この関数の定義をしてみます:

if (!function_exists('mb_str_replace')) {
    function mb_str_replace($search, $replace, $subject) {
        if (is_array($subject)) {
            foreach ($subject as $key => $val) {
                $subject[$key] = mb_str_replace((string)$search, $replace, $subject[$key]);
            }
            return $subject;
        }
        $pattern = '/(?:'.implode('|', array_map(create_function('$match', 'return preg_quote($match[0], "/");'), (array)$search)).')/u';
        if (is_array($search)) {
            if (is_array($replace)) {
                $len = min(count($search), count($replace));
                $table = array_combine(array_slice($search, 0, $len), array_slice($replace, 0, $len));
                $f = create_function('$match', '$table = '.var_export($table, true).'; return array_key_exists($match[0], $table) ? $table[$match[0]] : $match[0];');
                $subject = preg_replace_callback($pattern, $f, $subject);
                return $subject;
            }
        }
        $subject = preg_replace($pattern, (string)$replace, $subject);
        return $subject;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top