Подобно этому вопросу, я потребляю XML-продукт, в котором есть незаконные символы. Я серьезно сомневаюсь, что могу заставить их решить проблему, но я постараюсь. Тем временем я бы хотел поработать.
Проблема в том, что в нем есть пуля. Он отображается как «â € ¢» в моем источнике. Я пробовал несколько преобразований кодировки, но не нашел комбинацию, которая работает. (Я не привык даже думать о моем типе кодирования, поэтому я вне себя от своего элемента здесь.) Итак, я попробовал следующее, и кажется, что str_replace не распознает «•». (он отображает как высокий блок в моем текстовом редакторе). Вы можете видеть прокомментированные строки, где я пробовал несколько разных вещей.
Сначала я попытался заменить str на «â €», затем изменился, и это последнее:
// deal with bullets in XML. $bullet="•"; //this was copied and pasted from transliterated text. //$data=iconv( "UTF-8", "windows-1252//TRANSLIT", $data ); //transliterate the text: //$data=str_replace($bullet,'•',$data); // replace the bullet char $data=str_replace($bullet,' - ',$data); // replace the bullet char //$data=iconv( "windows-1252", "UTF-8", $data ); // return the text to utf-8 encoding.
Любые идеи, как удалить или заменить этот символ? Если есть функция предварительной очистки XML, это было бы здорово, и мне не пришлось бы беспокоиться об этом.
XML по определению не имеет незаконных символов. Если какая-либо строка содержит символ, который не является частью XML, то эта строка не является XML по определению .
Персонаж, которого вы беспокоите, является частью Unicode. Поскольку XML основан на Unicode, это хорошая новость. Итак, давайте назовем то, к чему вы стремились:
Итак, теперь вы говорите, что это проявляется как •
. Поскольку U + 2022 закодирован как 0xE2 0x80 0xA2 в UTF-8, более или менее безопасным предположением является утверждение, что вы берете кодированную строку UTF-8 (которая является кодировкой по умолчанию, используемой в XML-битте), но управляйте программным обеспечением, которое делает его обработкой, поскольку некоторая однобайтовая кодировка, следовательно, превращает единую кодовую точку в три разных символа:
Вместо этого вам нужно заставить приложение-рендеринг использовать кодировку UTF-8. Это должно немедленно решить вашу проблему. Поэтому найдите место, где вы вводите неверную кодировку, вам, скорее всего, не понадобится перекодировать его, просто чтобы правильно намекнуть на кодировку.
Если вам интересно, какие однобайтовые кодировки символов имеют эти три символа Unicode в соответствующих байтах (0xE2 0x80 0xA2), вот список. Я выделил самый популярный из них: