문제

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) 및 유니코드 문자 속성.

NFD는 "ü" 움라우트와 같은 문자를 "LATIN SMALL LETTER U WITH DIAERESIS"(문자)에서 "LATIN SMALL LETTER U"(문자) 및 "COMBINING DIARESIS"(문자 아님)로 변환합니다.

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

Normalizer 클래스는 PECL 국제 패키지.(알고리즘 자체는 그다지 복잡하지 않지만 많은 문자 매핑을 로드해야 합니다.나는 썼다 PHP 구현 얼마 전에.)

(아주 널리 알려지지 않은 좋은 기술인 것 같아 두 달 늦게 추가하게 되었습니다.)

다음 함수 정의를 시도해 보세요.

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