XML, не нарушающий пробелы

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

Похоже, что некоторые неприятные персонажи проникли в нашу базу данных MySQL из систем нашего бэк-офиса. Так как я пытаюсь запустить вывод XML с помощью PHP XMLWriter, но в поле попадает множество этих глупых символов.

Они отображаются в nano как ^K, в gedit как странный квадрат, и когда вы удаляете их вручную в MySQL, они не занимают физическое пространство, несмотря на то, что вы знаете, что что-то удалили.

Пожалуйста, помогите мне избавиться от них!

Вот строка, которая в настоящее время является кошмаром (остальную часть сборки XMLWriter я пропустил).

$writer->writeElement("description",$myitem->description);

person Paul Sellars    schedule 15.11.2011    source источник
comment
Где вы хотите избавиться от них?   -  person hakre    schedule 15.11.2011
comment
избавиться внутри MySQL было бы здорово, но изменение кодировки, похоже, не избавляет от них. Все, что мне действительно нужно, это удалить их до того, как они будут выведены в файл XML.   -  person Paul Sellars    schedule 15.11.2011
comment
Пожалуйста, добавьте сценарий, в котором вы создаете файл XML. Кроме того, знаете ли вы, что означает ^K в нано? Пожалуйста, дайте ссылку на спецификацию этих символов в nano.   -  person hakre    schedule 15.11.2011
comment
Добавлена ​​проблема, остальное - просто стандартная сборка php XMLWriter, не могу найти ссылку для nano с ^K, я предполагаю, что это недопустимый символ.   -  person Paul Sellars    schedule 15.11.2011
comment
Не могли бы вы убедиться, что это незаконно, а не просто какой-то непечатаемый символ (как я предполагаю, потому что, если вы удалите его, вы описываете, что операция невидима в MySQL)? А можно поконкретнее, в каком смысле это незаконно? Что такое юридические символы? Какая кодировка используется?   -  person hakre    schedule 15.11.2011


Ответы (2)


После того, как вы определили, какой именно символ вы хотите удалить (и его двоичную последовательность), вы можете просто удалить его. Например, с str_replace:

$binSequence = "..."; // the binary representation of the character in question
$descriptionFiltered = str_replace($binSequence, '', $myitem->description);
$writer->writeElement("description", $descriptionFiltered);

Вы еще не указали, о каком конкретно символе идет речь, поэтому я пока не могу указать двоичную последовательность. Также, если вы говорите о группе символов, фильтрация может немного отличаться.

person hakre    schedule 15.11.2011

Похоже, что это вертикальные вкладки, ASCII x0B. Вы должны быть в состоянии REPLACE их в MySQL:

SELECT REPLACE('\v', '', `value`) WHERE key = 'foo';

Однако официальный справочник не упоминает конкретно \v. Если это не работает, вы можете удалить его позже в PHP с помощью простого str_replace (начиная с PHP 5.2.5):

str_replace("\v", '', $result);
person Boldewyn    schedule 15.11.2011