2014-01-14 5 views
1

У меня есть строка, которую я хочу заменить всеми символами 'a' на греческий символ α. Я не хочу преобразовывать элементы html внутри строки, то есть <a href="http://a-url-with-a-characters">text</a>.Кодировка замены символов php

Функция:

function grstrletter($string){ 

    $skip = false; 
    $str_length = strlen($string); 

    for ($i=0; $i < $str_length; $i++){ 

     if($string[$i] == '<'){ 
      $skip = true; 
     } 

     if($string[$i] == '>'){ 
      $skip = false; 
     } 

     if ($string[$i]=='a' && !$skip){ 
      $string[$i] = 'α'; 
     } 
    } 

    return $string; 

} 

Еще одна функция, которую я сделал работает отлично, но он не принимает во внимание элементы HMTL.

function grstrletter_no_html($string){ 

return strtr($string, array('a' => 'α')); 

} 

Я также пробовал много функций кодирования, которые php предлагает без везения.

Когда я повторяю греческую букву, браузер выводит ее без проблем. Когда я возвращаю строку, браузер выводит классический странный знак вопроса внутри треугольника всякий раз, когда происходило замещение.

Мой заголовок имеет <meta http-equiv="content-type" content="text/html; charset=UTF-8">, и я также пробовал его с помощью php header('Content-Type: text/html; charset=utf-8');, но снова не повезло.

Строка поступает из базы данных в UTF-8, а сайт находится в Wordpress, поэтому я просто использую функции wordpress для получения содержимого, которое я хочу. Я не думаю, что это проблема с db, потому что, когда я использую свою функцию grstrletter_no_html(), все работает нормально.

Проблема возникает, когда я повторяю символ строки символом.

Файл сохраняется как UTF-8 без спецификации (блокнот ++). Я также попытался изменить кодировку файла без лишней удачи.

Я также попытался заменить греческую букву соответствующим html-объектом &#945; и &alpha;, но опять же те же результаты.

Я еще не пробовал никаких регулярных выражений.

Буду признателен за любую помощь и благодарность заранее.

Пробовал: Greek characters encoding works in HTML but not in PHP

EDIT

Решение, основанное на deceze блестящий ответ:

function grstrletter($string){ 

    $skip = false; 
    $str_length = strlen($string); 

    for ($i=0; $i < $str_length; $i++){ 

     if($string[$i] == '<'){ 
      $skip = true; 
     } 

     if($string[$i] == '>'){ 
      $skip = false; 
     } 

     if ($string[$i]=='a' && !$skip){ 
      $part1 = substr($string, 0, $i); 
      $part1 = $part1 . 'α'; 
      $string = $part1 . substr($string, $i+1); 
     } 
    } 

    return $string; 

} 

ответ

2

Проблема заключается в том, что вы устанавливаете только один байт вашей строки , Пример:

$str = "\x00\x00\x00"; 

var_dump(bin2hex($str)); 

$str[1] = "\xff\xff"; 

var_dump(bin2hex($str)); 

Выход:

string(6) "000000" 
string(6) "00ff00" 

Вы устанавливаете два-байтовый символ а, но только один байт из него фактически проталкивается в строку. Второй результат здесь должен быть 00ffff, чтобы ваш код работал.

Что вам нужно, чтобы вырезать строку из 0 в $i - 1, сцепить 'α' в него, а затем сцепить остальную часть строки $i + 1 до конца на него, если вы хотите вставить многобайтовый характер.Это или работает с персоналом вместо байт с использованием функций mbstring.

Дополнительную информацию о фоновой информации см. What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text.

+0

Большое спасибо !!!!! Я тоже понял логику. Благодаря! – Laxmana

Смежные вопросы