Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не работает iconv()
 
 автор: Blizard   (30.08.2011 в 22:39)   письмо автору
 
 

Пытаюсь перекодировать текст из utf-8 в windows-1251, но по ходу не работатет функция ivonv() выдает ошибку типа "Удаленный сервер или файл не найден"


$thistext = $text[1].$text[2].$text[3];
$alltext = iconv("utf-8", "cp1251", $thistext);


как быть в такой ситуации?

  Ответить  
 
 автор: sl1p   (30.08.2011 в 22:46)   письмо автору
 
   для: Blizard   (30.08.2011 в 22:39)
 

видимо это не iconv выдает:)

  Ответить  
 
 автор: Blizard   (30.08.2011 в 22:56)   письмо автору
 
   для: sl1p   (30.08.2011 в 22:46)
 

мне тоже так кажется, но где ошибка тогда в этих двух строках? точнее во второй?

убираю
$alltext = iconv("utf-8", "cp1251", $thistext);


и все начинает работать, ставлю обратно - опять ошибка сервера

  Ответить  
 
 автор: Drago   (31.08.2011 в 02:44)   письмо автору
 
   для: Blizard   (30.08.2011 в 22:56)
 

Значит где-то ниже, у вас, идет запрос к другому серверу или файлу с данными из $alltext. Сервер принимает данные в utf-8, а вы ему шлете cp1251.

  Ответить  
 
 автор: Blizard   (31.08.2011 в 11:09)   письмо автору
 
   для: Drago   (31.08.2011 в 02:44)
 

Вот код конца файла:


$thistext = $text[1].$text[2].$text[3];
$alltext = iconv("utf-8", "cp1251", $thistext);
$fp = fopen("./testml.xml","w");
flock($fp, LOCK_EX);
$fw = fwrite($fp,$alltext);
flock($fp, LOCK_UN);
$fc = fclose($fp); 


в массиве $text лежит код xml файла, который я генерирую средствами php

Просто проблема в том, что yandex маркет, который качает этот xml файл ругается на кодировку, а если зайти в файл с панели ispmanager и пересохранить его в windows-1251 то все ок становится, но процесс генерации xml файла настроен из крона каждый час, поэтому вручную не вариант, а автоматически проблема с кодировкой. Помогите решить эту задачу. Я уже думал может промежуточно сохранять в .txt файл или в базу куда-то, это может на что-то повлиять? Уже не знаю что делать, застопорился на одном моменте.

  Ответить  
 
 автор: Drago   (31.08.2011 в 11:40)   письмо автору
 
   для: Blizard   (31.08.2011 в 11:09)
 

Вы сначала разберитесь что выдает ваше "Удаленный сервер или файл не найден", если это точный текст ошибки, конечно. Сама по себе конвертация кодировки такого не вызывает.

  Ответить  
 
 автор: Blizard   (31.08.2011 в 12:04)   письмо автору
 
   для: Drago   (31.08.2011 в 11:40)
 

Я поэтому сюда и написал, что не могу разобраться. Убираю одну строку, которая переводит из одной кодировки в другую и все нормально начинает работать, только разумеется не в той кодировке в xml файл пишет . А есть какие-то альтернативные варианты iconv() ? И как проверить включена ли вообще эта функция у меня на сервере в php?

  Ответить  
 
 автор: Drago   (31.08.2011 в 13:55)   письмо автору
 
   для: Blizard   (31.08.2011 в 12:04)
 

> И как проверить включена ли вообще эта функция у меня на сервере в php?

Посмотреть phpinfo().

> Я поэтому сюда и написал, что не могу разобраться.

Вы не можете разобраться, что в вашем приложении выдает ошибку? Это ваше приложение? Это точный текст ошибки?

Проблема не в функции iconv(), а в том, что ваше приложение (или не ваше) не может корректно работать с данными в той кодировке, в которой вы пытаетесь ему навязать.

Никто вам конкретно не скажет в чем проблема без детальных подробностей.

  Ответить  
 
 автор: Blizard   (31.08.2011 в 14:52)   письмо автору
 
   для: Drago   (31.08.2011 в 13:55)
 

Для детальных подробностей могу привести весь код файла:


<?php
header
('Content-Type: text/html; charset=cp1251');
$data date("Y-m-d H:i");
$vop "?";
$sk[2] = ">";
$sk[1] = "<";
$kov[1] = '"';
$kov[2] = "'";
$text[1] = "
"
.$sk[1].$vop."xml version=".$kov[1]."1.0".$kov[1]." encoding=".$kov[1]."windows-1251".$kov[1].$vop.$sk[2]."
"
.$sk[1]."!DOCTYPE yml_catalog SYSTEM ".$kov[1]."shops.dtd".$kov[1].$sk[2]."
"
.$sk[1]."yml_catalog date=".$kov[1].$data.$kov[1].$sk[2]."
"
.$sk[1]."shop".$sk[2]."
"
.$sk[1]."name".$sk[2]."
Тут название компании
"
.$sk[1]."/name".$sk[2]."
"
.$sk[1]."company".$sk[2]."
Тут название компании
"
.$sk[1]."/company".$sk[2]."
"
.$sk[1]."url".$sk[2]."
http://mysite.ru/
"
.$sk[1]."/url".$sk[2]."
"
.$sk[1]."currencies".$sk[2]."
"
.$sk[1]."currency id=".$kov[1]."RUR".$kov[1]."/".$sk[2]."
"
.$sk[1]."/currencies".$sk[2]."
"
.$sk[1]."categories".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."1".$kov[1].$sk[2]."
Напитки
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."2".$kov[1].$sk[2]."
Креатин
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."3".$kov[1].$sk[2]."
Протеины
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."4".$kov[1].$sk[2]."
Гейнеры
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."5".$kov[1].$sk[2]."
Аминокислоты
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."6".$kov[1].$sk[2]."
Глютамин
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."7".$kov[1].$sk[2]."
BCAA
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."8".$kov[1].$sk[2]."
Гуарана
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."9".$kov[1].$sk[2]."
Углеводы
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."10".$kov[1].$sk[2]."
Нитробустеры
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."11".$kov[1].$sk[2]."
Батончики
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."12".$kov[1].$sk[2]."
HC - Products
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."13".$kov[1].$sk[2]."
L-Carnitine
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."14".$kov[1].$sk[2]."
Энергетики
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."15".$kov[1].$sk[2]."
Витамины
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."16".$kov[1].$sk[2]."
Магний
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."17".$kov[1].$sk[2]."
Анаболики
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."18".$kov[1].$sk[2]."
Восстановители
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."19".$kov[1].$sk[2]."
Термогеники
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."20".$kov[1].$sk[2]."
Для суставов
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."21".$kov[1].$sk[2]."
Специальные препараты
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."category id=".$kov[1]."22".$kov[1].$sk[2]."
Жиросжигатели
"
.$sk[1]."/category".$sk[2]."
"
.$sk[1]."/categories".$sk[2]."
"
.$sk[1]."offers".$sk[2]."
"
;
$fil File("./bd/bd.dat");
foreach(
$fil as $key => $value)
     {
     
$ex explode("^",$value);
     if ((
$ex[9] > 0) && ($ex[0] != 0))
           {
            
$cen $ex[8];
            
$cex explode("|",$cen);
            
$cena $cex[0];
            if (
$ex[2] == "Напитки") {$thisid=1;}
            if (
$ex[2] == "Креатин") {$thisid=2;}
            if (
$ex[2] == "Протеины") {$thisid=3;}
            if (
$ex[2] == "Гейнеры") {$thisid=4;}
            if (
$ex[2] == "Аминокислоты") {$thisid=5;}
            if (
$ex[2] == "Глютамин") {$thisid=6;}
            if (
$ex[2] == "BCAA") {$thisid=7;}
            if (
$ex[2] == "Гуарана") {$thisid=8;}
            if (
$ex[2] == "Углеводы") {$thisid=9;}
            if (
$ex[2] == "Нитробустеры") {$thisid=10;}
            if (
$ex[2] == "Батончики") {$thisid=11;}
            if (
$ex[2] == "HC - Products") {$thisid=12;}
            if (
$ex[2] == "L-Carnitine") {$thisid=13;}
            if (
$ex[2] == "Энергетики") {$thisid=14;}
            if (
$ex[2] == "Витамины") {$thisid=15;}
            if (
$ex[2] == "Магний") {$thisid=16;}
            if (
$ex[2] == "Анаболики") {$thisid=17;}
            if (
$ex[2] == "Восстановители") {$thisid=18;}
            if (
$ex[2] == "Термогеники") {$thisid=19;}
            if (
$ex[2] == "Для суставов") {$thisid=20;}
            if (
$ex[2] == "Спец. препараты") {$thisid=21;}
            if (
$ex[2] == "Жиросжигатели") {$thisid=22;}
            
$text[2] .= $sk[1]."offer id=".$kov[1].$key.$kov[1]." available=".$kov[1]."true".$kov[1].$sk[2]."\r\n";
            
$text[2] .= $sk[1]."url".$sk[2]."\r\n";
            
$text[2] .= "http://mysite.ru/tovar.php?id=".$key."\r\n";
            
$text[2] .= $sk[1]."/url".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."price".$sk[2]."\r\n".$cena."\r\n".$sk[1]."/price".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."currencyId".$sk[2]."\r\nRUR\r\n".$sk[1]."/currencyId".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."categoryId".$sk[2]."\r\n".$thisid."\r\n".$sk[1]."/categoryId".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."picture".$sk[2]."\r\nhttp://mysite.ru/imgsw/w".$key.".jpg\r\n".$sk[1]."/picture".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."delivery".$sk[2]."\r\ntrue\r\n".$sk[1]."/delivery".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."name".$sk[2]."\r\n".$ex[3]."\r\n".$sk[1]."/name".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."vendor".$sk[2]."\r\n".$ex[1]."\r\n".$sk[1]."/vendor".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."description".$sk[2]."\r\n".$ex[6]." ".$ex[5]."\r\n".$sk[1]."/description".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."sales_notes".$sk[2]."\r\nМинимальная сумма заказа - 2000 рублей\r\n".$sk[1]."/sales_notes".$sk[2]."\r\n";
            
$text[2] .= $sk[1]."/offer".$sk[2]."\r\n";
            }
     }
$text[3] = $sk[1]."/offers".$sk[2]."
"
.$sk[1]."/shop".$sk[2]."
"
.$sk[1]."/yml_catalog".$sk[2]."
"
;
$thistext $text[1].$text[2].$text[3];
$fp fopen("./testml.xml","w");
flock($fpLOCK_EX);
$fw fwrite($fp,$thistext);
flock($fpLOCK_UN);
$fc fclose($fp); 
?>


После выполнения генерируется следующий файл (testml.xml):


<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="2011-08-30 23:13">
<shop>
<name>
Тут название компании
</name>
<company>
Тут название компании
</company>
<url>
http://mysite.ru/
</url>
<currencies>
<currency id="RUR"/>
</currencies>
<categories>
<category id="1">
Напитки
</category>
<category id="2">
Креатин
</category>
<category id="3">
Протеины
</category>
<category id="4">
Гейнеры
</category>
<category id="5">
Аминокислоты
</category>
<category id="6">
Глютамин
</category>
<category id="7">
BCAA
</category>
<category id="8">
Гуарана
</category>
<category id="9">
Углеводы
</category>
<category id="10">
Нитробустеры
</category>
<category id="11">
Батончики
</category>
<category id="12">
HC - Products
</category>
<category id="13">
L-Carnitine
</category>
<category id="14">
Энергетики
</category>
<category id="15">
Витамины
</category>
<category id="16">
Магний
</category>
<category id="17">
Анаболики
</category>
<category id="18">
Восстановители
</category>
<category id="19">
Термогеники
</category>
<category id="20">
Для суставов
</category>
<category id="21">
Специальные препараты
</category>
<category id="22">
Жиросжигатели
</category>
</categories>
<offers>
<offer id="3" available="true">
<url>
http://mysite.ru/tovar.php?id=3
</url>
<price>
2907.00
</price>
<currencyId>
RUR
</currencyId>
<categoryId>
3
</categoryId>
<picture>
http://mysite.ru/imgsw/w3.jpg
</picture>
<delivery>
true
</delivery>
<name>
Weider Premium Whey Protein
</name>
<vendor>
Weider
</vendor>
<description>
банка 2300 г.
</description>
<sales_notes>
Минимальная сумма заказа - 2000 рублей
</sales_notes>
</offer>
</offers>
</shop>
</yml_catalog>


код стает нерабочим после замены:


$thistext = $text[1].$text[2].$text[3];
$fp = fopen("./testml.xml","w");
flock($fp, LOCK_EX);
$fw = fwrite($fp,$thistext);
flock($fp, LOCK_UN);
$fc = fclose($fp); 


на


$thistext = $text[1].$text[2].$text[3];
$alltext = incovn("utf-8","windows-1251",$thistext);
$fp = fopen("./testml.xml","w");
flock($fp, LOCK_EX);
$fw = fwrite($fp,$alltext);
flock($fp, LOCK_UN);
$fc = fclose($fp); 

  Ответить  
 
 автор: Drago   (31.08.2011 в 15:12)   письмо автору
 
   для: Blizard   (31.08.2011 в 14:52)
 

Я у вас в третий раз спрашиваю, в чем заключается ошибка? Какой скрипт, в какой строке выводит сообщение "Удаленный сервер или файл не найден"?

И кстати, вы уверены, что ваш файл bd/bd.dat изначально в кодировке utf-8?

  Ответить  
 
 автор: Blizard   (31.08.2011 в 15:46)   письмо автору
 
   для: Drago   (31.08.2011 в 15:12)
 

Попробую перефразировать - если xml файл генерируется средствами php, то yandex маркет говорит об ошибке: Определена кодировка: windows-1251, но текст файла в иной кодировке. Поэтому я и стараюсь записывать с помощью ф-ии incovn() текст в кодировке windows-1251, но при использовании incovn() при обращении к скрипту с браузера выдает ошибку, что страница не найдена, аналогично тому, если обратиться к несуществующей странице. Если убрать функцию incovn() и после того, как файл сгенерирован зайти на хостинг с панели ispmanager и пересохранить его вручную (т.е. зайти в режиме редактирования в файл и нажать ок) то яндекс перестает ругаться. Иными словами так получается вручную перекодировать содержимое xml файла, но ручной вариант мне не подходит. Я не знаю как еще ответить на ваш вопрос - в чем заключается ошибка? =)

Нет, я не уверен, что файл bd/bd.dat изначально в кодировке utf-8, потому что он в кодировке windows-1251

Не знаю, как на других хостингах и на других панелях, но на majordomo в ispmanager у файлов может быть только одна кодировка на всех, если вручную меняю на utf-8, то просто в файлах начинает писать encoding.

  Ответить  
 
 автор: Drago   (31.08.2011 в 16:17)   письмо автору
 
   для: Blizard   (31.08.2011 в 15:46)
 

> Нет, я не уверен, что файл bd/bd.dat изначально в кодировке utf-8, потому что он в кодировке windows-1251

И при этом, вы же его пытаетесь сконвертировать из utf в windows-1251.

Прикрепите к сообщению два файла в архиве. Один обработанный iconv, второй нет.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования