Загрузка русского xml

papabear

Новичок
Загрузка русского xml

Помогите пожалуйста разобраться, как загрузить xml-документ в кодировке windows-1251 в DOM-объект (php5). А потом нужно сохранить это в файл опять в кодировке windows-1251.
Я знаю, что нужно перекодировать в Utf-8.
Пробовал так:
PHP:
$doc = new domDocument('1.0','Windows-1251'); 
$doc->load('file.xml'); 
$doc->save('file.xml');
И русские буквы превращаются в иероглифы...
А также так:
PHP:
$doc = new domDocument; 
$x = join('',file('file.xml')); 
$x = iconv('windows-1251','utf-8',$x); 
$doc->loadXML($x); 
$doc->save('file.xml');
Теперь вместо русского текста - код наподобие "л"...
Я в тупике..

-~{}~ 06.09.06 14:18:

хм.... на форуме код превратился в букву "л", к чему бы это...
 

tecgnotes

Новичок
надо еще и обратно конвертировать из utf в windows-1251 после того как вы закончили преобразования с xml
 

papabear

Новичок
Да, я заработался уже и забыл написать, я пробовал конвертировать обратно так:
PHP:
$x = $doc->saveXML(); 	
$x = iconv('utf-8','windows-1251',$x);  		
file_put_contents($filename,$x);
Но в результате вместо букв опять коды
 

papabear

Новичок
Пробовал закодировать в utf-8 с помощью iconv, а раскодировать с utf8_decode(), а также пробовал кодировать с utf8_encode().
В первом случае &#-коды русских букв, во втором &#-коды иероглифов(
 

Wicked

Новичок
tony2001
а нужно ли вообще что-либо куда-либо конвертить, будь то iconv, utf8_*, или что-то еще? :)
 

papabear

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

tecgnotes

Новичок
стоп! так проболема решена?просто у вас все символы были прпеобразованы в htmlentities?если вы говорите что и так вывод нормально работает...
 

papabear

Новичок
Да не совсем. Нужно их сохранить в win-1251 а не в &#-кодах. А про htmlentities Вы правы
 

tecgnotes

Новичок
тогда не вижу проблемы - есть спец функция для таких случаев:)
.....


может еще чтото дописать забыли?
 

papabear

Новичок
Делаю так:
$x = $doc->saveXML();
$x = html_entity_decode($x,ENT_QUOTES,cp1251);
file_put_contents($filename,$x);
Ничего не выходит, всё равно сохраняются &#-коды
 

papabear

Новичок
нууу даа... а что?

-~{}~ 06.09.06 18:22:

понял ошибку, сделал так: $x = html_entity_decode($x,ENT_QUOTES, 'cp1251');

-~{}~ 06.09.06 18:22:

не работает
 

papabear

Новичок
У меня такое чувство, что я чего-то не знаю, что все знают..
Ну расскажите, как бы вы решили бы эту проблему - загрузить файл в кодировке windows-1251, изменить его и сохранить в этой же кодировке - чтобы можно было открыть в notepad'е и нормально прочитать русские буквы!

-~{}~ 06.09.06 22:46:

Идея! Создать файл xml в кодировке utf-8! Но она провалилась, т.к. после сохранения изменённого xml в этот файл всё равно вылезают эти КОДЫ символов!!!
 

Wicked

Новичок
1) DOM самодостаточен при работе с кодировками. Никаких utf8_*, iconv, html_decode_entites не требуется.

Если у тебя есть валидный xml документ, то после преобразования
$doc = new domDocument('1.0','Windows-1251');
$doc->load('file.xml');
$doc->save('file.xml');
он не должен существенно измениться.

По крайней мере у меня все отлично работает, и скорее всего у тебя проблемы с оригинальным file.xml. Некоторую помощь тебе может оказать, например, IE, если ты откроешь в нем оригинал. Он тебе должен показать xml на русском языке.

2) когда ты делаешь new domDocument('1.0','Windows-1251');, а затем load(), то кодировка переопределяется той, которая указана в декларации xml документа file.xml. Проверь $doc->actualEncoding после load'а.

3) когда ты делаешь чтение файла, и затем запись в него обратно, то можно тем самым накапливать ошибку. Записывай лучше в другой файл.
 

papabear

Новичок
Фуф, спасибо. Вот так часто бывает - мучаешься с проблемой, пробуешь множество путей решения, а всё оказывается так банально((
Вот что я делал:
в $old загружается xml-файл
создаётся аналогичный xml и пишется в $new
производится сравнение $old и $new
$new пишется в xml-файл
Проблема была в том, что, во-первых, в файле не было прописано кодировки, а во вторых, при создании $new из строки кодировки тоже не было указано.. Я думал что она жёстко задаётся при "new domDocument('1.0','Windows-1251')", но, как выяснилось, её определяет файл.. вот. Все проблемы решены, спасибо!!
 
Сверху