У меня есть строка с "\u00a0", и мне нужно заменить ее на "" str_replace не удается

Мне нужно очистить строку, которая приходит (копируется / вставляется) из различных приложений пакета Microsoft Office ( Excel, Access и Word), каждое из которых имеет свой собственный набор кодировок.

Я использую json_encode для отладки, чтобы видеть каждый закодированный символ.

Я могу очистить все, что нашел (\r \n), с помощью str_replace, но с \u00a0 мне не повезло.

$string = 'mail@mail.com\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0;mail@mail.com'; //this is the output from json_encode

$clean = str_replace("\u00a0", "",$string);

возвращает:

mail@mail.com\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0;mail@mail.com

Это точно так же; он полностью игнорирует \u00a0.

Это можно обойти? Кроме того, я чувствую, что заново изобретаю колесо, есть ли функция / класс, который полностью удаляет КАЖДЫЙ возможный символ КАЖДОГО возможного кодирования?

____РЕДАКТИРОВАТЬ____

После первых двух ответов мне нужно уточнить, что мой пример работает, потому что это вывод json_encode, а не фактическая строка!

9 ответов

Решение

У меня работает, когда я копирую / вставляю твой код. Попробуйте заменить двойные кавычки в вашем str_replace() с одинарными кавычками или без обратной косой черты ("\\u00a0").

Объединяя ord() с substr() в моей строке, содержащей \u00a0, я нашел следующее проклятие:

$text = str_replace( chr( 194 ) . chr( 160 ), ' ', $text );

Попробуй это:

$str = str_replace("\u{00a0}", ' ', $str);

У меня просто была такая же проблема. Очевидно, PHP json_encode вернет ноль для любой строки с "неразрывным пробелом" в ней.

Решение состоит в том, чтобы заменить это обычным пробелом:

str_replace(chr(160),' ');

Надеюсь, это кому-нибудь поможет - мне понадобился час, чтобы понять.

Этот тоже работает, я где-то нашел

$str = trim($str, chr(0xC2).chr(0xA0));

Незначительный момент: \u00a0 на самом деле является неразрывным пробелом, ср. http://www.fileformat.info/info/unicode/char/a0/index.htm

Так что было бы правильнее заменить его на " "

Вы должны сделать это с помощью одинарных кавычек:

str_replace('\u00a0', "",$string);

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

str_replace("\\u00a0", "",$string);

Это помогло мне:

$str = preg_replace( "~\x{00a0}~siu", " ", $str );

Вы можете использовать json_encode($string, JSON_UNESCAPED_UNICODE |JSON_PRETTY_PRINT);

Другие вопросы по тегам