Замена символа в PHP - PullRequest
       24

Замена символа в PHP

5 голосов
/ 30 апреля 2010

Я с трудом пытаюсь заменить этот странный правильный символ одинарной кавычки. Я использую str_replace, как это:

str_replace("’", '\u1234', $string);

Похоже, я не могу понять, какой персонаж на самом деле является цитатой. Даже когда я копирую и вставляю его прямо из PHPMyAdmin, он все равно не работает. Должен ли я как-то избежать этого?

Символ: http://www.lukomon.com/Afbeelding%204.png

  • MySQL Charset: UTF-8 Unicode (utf8)
  • Параметры сортировки MySQL: utf8_unicode_ci
  • <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

EDIT: Оказалось, что Microsoft оставила одинарную кавычку, которую я мог бы заменить этой функцией из комментария Фила Паффорда. Не уверен, какой ответ я должен отметить сейчас ...

Ответы [ 10 ]

8 голосов
/ 02 мая 2010

Это случилось со мной тоже. Пара вещей:

  • Используйте функцию htmlentities для вашего текста

    $my_text = htmlentities($string, ENT_QUOTES, 'UTF-8');

Подробнее о функции htmlentities.

  • Используйте правильный тип документа, мне это удалось.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  • Используйте utf-8 тип кодировки на своей странице:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Вот окончательный прототип для вашей страницы:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>    
<body>

<?php     
    // your code related to database        
    $my_text = htmlentities($string, ENT_QUOTES, 'UTF-8');    
?>

</body>
</html>

.

Если вы хотите заменить , однако, попробуйте функцию mb_ereg_replace.

Пример:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

$my_text = mb_ereg_replace("’","'", $string);
3 голосов
/ 05 октября 2012

У меня была такая же проблема, и я обнаружил, что это работает:

function replace_rsquote($haystack,$replacewith){
   $pos = strpos($haystack,chr("226"));
   if($pos > -1){
       return substr_replace($haystack,$replacewith,$pos,3);
   } else return $haystack;
}

Пример:

echo replace_rsquote("Nick’s","'"); //Nick's
2 голосов
/ 02 мая 2010

Чтобы узнать, что это за символ, запустите его через функцию ord, которая даст вам код ASCII символа:

echo ord('’'); // 226

Теперь, когда вы знаете, что это такое, вы можете сделать это:

str_replace('’', chr(226), $string);
1 голос
/ 04 мая 2010

Гамбо грустный правый -
- сохраните ваш скрипт как файл utf-8
- и используйте http://php.net/mbstring (как Сарфраз указал в своем последнем примере)

1 голос
/ 02 мая 2010

Если вы используете не-ASCII-символы в своем PHP-коде, вам необходимо убедиться, что вы используете ту же кодировку символов, что и в данных, которые вы обрабатываете. Ваша попытка, вероятно, не удалась, потому что вы используете другую кодировку символов в вашем скрипте PHP, чем в $string.

Кроме того, если вы используете многобайтовую кодировку символов, например UTF-8, вам также следует использовать многобайтовые строковые функции .

1 голос
/ 02 мая 2010

Чтобы заменить его:

Если ваш файл сценария закодирован в той же кодировке, что и данные, в которых вы пытаетесь выполнить замену, он должен работать так, как вы его разместили. Если вы работаете с данными UTF-8, убедитесь, что скрипт закодирован в UTF-8, и это не ваш редактор, который молча транслитерирует символ при вставке.

Если это не сработает, попробуйте экранировать его, как описано ниже, и посмотрите, какой код он возвращает.

Чтобы избежать этого:

Если ваш исходный файл закодирован в UTF-8, это должно работать:

$string = htmlentities($string, ENT_QUOTES, "UTF-8");

набор символов по умолчанию html... равен iso-8859-1. Все, что отличается от этого, должно быть четко указано.

Для более сложных проблем с преобразованием символов всегда проверяйте примечания, вносимые пользователем для таких функций, как htmlentities(), там часто можно найти настоящие драгоценные камни.

В целом:

Бобинс прав в своем комментарии, системные проблемы набора символов должны систематически сортироваться, чтобы они не кусали вас в задницу - если только определяя, какой набор символов используется на каждом этапе пути:

  • Как кодируется файл скрипта;
  • как подается документ;
  • как данные хранятся в базе данных;
  • Как кодируется соединение с базой данных.
0 голосов
/ 31 июля 2017

Вы можете получить код char ascii с помощью ord , а затем заменить его на желаемый символ:

$asciicode = ord('’'); // 146
$stringfixed = str_replace(chr($asciicode), '\'', $string);
0 голосов
/ 08 мая 2010

Не используйте функции регулярных выражений (preg_replace или mb_ereg_replace). Они слишком тяжелы для этого.

str_replace(chr(226),'\u2019' , $string);

Если ваша игла является многобайтовым символом, вам может повезти с этой функцией на заказ:

<?php 
function mb_str_replace($needle, $replacement, $haystack) {
    $needle_len = mb_strlen($needle);
    $replacement_len = mb_strlen($replacement);
    $pos = mb_strpos($haystack, $needle);
    while ($pos !== false)
    {
        $haystack = mb_substr($haystack, 0, $pos) . $replacement
                . mb_substr($haystack, $pos + $needle_len);
        $pos = mb_strpos($haystack, $needle, $pos + $replacement_len);
    }
    return $haystack; 
} 
?>

кредит для этой последней функции: http://www.php.net/manual/en/ref.mbstring.php#86120

0 голосов
/ 03 мая 2010

Этот символ является правой одинарной кавычкой .

Чтобы заменить его шаблоном, вам нужно сделать что-то вроде этого

$string = preg_replace( "/\\x{2019}/u", 'replacement', $string );

Но это действительно касается только симптома. Проблема в том, что вы не используете кодировку символов во всем приложении, как отмечали другие.

0 голосов
/ 30 апреля 2010

Почему бы не выполнить строку через htmlspecialchars () и вывести ее, чтобы увидеть, во что он превращает этот символ, чтобы вы знали, что использовать в качестве выражения замены?

...