неразрывный пробел utf-8 0xc2a0 и preg_replace странное поведение

В моей строке у меня есть неразрывный пробел utf-8 (0xc2a0), и я хочу заменить его на что-то другое.

Когда я использую

$str=preg_replace('~\xc2\xa0~', 'X', $str);

все работает хорошо

Но когда я использую

$str=preg_replace('~\x{C2A0}~siu', 'W', $str);

неразрывный пробел не найден (и заменен).

Почему? Что не так со вторым регулярным выражением?

Формат\x{C2A0} правильно, также я использовалu флаг.

 YOU11 окт. 2012 г., 12:48
Может быть, потому, что$str не является строкой Юникода.

Ответы на вопрос(5)

/ \ x {00A0} /, / \ xC2 \ xA0 / и $ clean_hex2bin-str_replace-bin2hex работали и не работали. это все хорошо, но если бы я попытался сохранить это в файл, файл был бы пустым!

В итоге я использовал iconv ('UTF-8', 'ISO-8859-1 // IGNORE', $ str);

Решение Вопроса

Когда вы используете\xc2\xa0 синтаксис, он ищет символ UTF-8. Но с\x{c2a0} синтаксис, он пытается преобразовать последовательность Unicode в кодированный символ UTF-8.

Неразрывный пробелU+00A0 (Unicode), но закодирован какC2A0 в UTF-8. Так что если вы попробуете с рисунком~\x{00a0}~siuбудет работать как положено.

 Newbo.O19 июл. 2013 г., 11:25
эта статья здорово понять больше на эту тему. Есть такжеэтот ТАК вопрос где бывшая статья была скопирована / вставлена.
 DamirR11 окт. 2012 г., 14:33
Да, \ x {00a0} работает, спасибо.
 Buttle Butkus19 июл. 2013 г., 00:53
Привет Ньюбо. Ваш ответ сработал для меня, но я до сих пор не понимаю, почему. Это потому, что мой nbsp не UTF-8? Мои данные поступают из таблицы базы данных с набором символов utf8_general_ci, поэтому это должен быть UTF-8 (мои character_set_client и character_set_connection также являются UTF-8). У вас есть ссылка для получения дополнительной информации по этому вопросу? Благодарю.

\xc2\xa0 заменит ДВА символа,\xc2 а также\xa0 с ничем.

В кодировке UTF-8 это является кодовой точкой дляU+00A0.

Есть ли\x{00A0} работай? Это должно быть представление для\xc2\xa0.

 DamirR11 окт. 2012 г., 14:35
\ x {00a0} работает, спасибо.

чтобы люди могли просто скопировать / вставить следующий код, чтобы выбрать свой любимый метод:

$some_text_with_non_breaking_spaces = "some text with 2 non breaking spaces at the beginning";
echo 'Qty non-breaking space : ' . substr_count($some_text_with_non_breaking_spaces, "\xc2\xa0") . '<br>';
echo $some_text_with_non_breaking_spaces . '<br>';

# Method 1 : regular expression
$clean_text = preg_replace('~\x{00a0}~siu', ' ', $some_text_with_non_breaking_spaces);

# Method 2 : convert to bin -> replace -> convert to hex
$clean_text = hex2bin(str_replace('c2a0', '20', bin2hex($some_text_with_non_breaking_spaces)));

# Method 3 : my favorite
$clean_text = str_replace("\xc2\xa0", " ", $some_text_with_non_breaking_spaces);

echo 'Qty non-breaking space : ' . substr_count($clean_text, "\xc2\xa0"). '<br>';
echo $clean_text . '<br>';

~\x{c2a0}~siu.

Varian\x{00A0} работает. Я не пробовал второй вариант, и вот результат:

Я пытался преобразовать его в шестнадцатеричное и заменить пробел0xC2 0xA0 (c2a0) в космос0x20 (20).

Код:

$hex = bin2hex($item);
$_item = str_replace('c2a0', '20', $hex);
$item = hex2bin($_item);
 realmag77726 сент. 2014 г., 16:22
Спасибо, работает ...

Ваш ответ на вопрос