Похоже, SimpleXML создает строку UTF-8, которая затем отображается в ISO-8859-1 (латиница-1) или что-то похожее на CP-1252.
Когда вы сохраняете результат в файл и передаете этот файл через веб-сервер, браузер будет использовать кодировку, объявленную в файле.
Включая веб-страницу
Так как кодировка вашей веб-страницы не UTF-8, вам необходимо преобразовать строку в любую кодировку, которую вы используете, например, ISO-8859-1 (latin-1).
Это легко сделать с помощью iconv ():
$xmlout = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $xmlout);
Сохранение в базе данных
Столбец базы данных не использует параметры сортировки UTF-8, поэтому вы должны использовать iconv
для преобразования строки в набор символов, используемый вашей базой данных.
Предполагая, что ваша сортировка базы данных совпадает с кодировкой, в которой вы отображаете, вам не придется ничего делать при чтении из базы данных.
Объяснение
В UTF-8 байт префикса 0xc2 используется для доступа к верхней половине блока «Latin-1 Supplement», который включает такие символы, как акцентированные буквы, символы валюты, дроби, верхний индекс 2 и 3, символы авторского права и зарегистрированного товарного знака, и неразрывный пробел.
Однако в ISO-8859-1 байт 0xC2 представляет Â. Поэтому, когда ваша строка UTF-8 неверно истолковывается как одна из них, вы получаете Â, за которой следует какой-то другой бессмысленный символ.