Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Русский текст из xml, формата win1251, не отображает (http://www.flasher.ru/forum/showthread.php?t=93977)

MINASTIS 02.04.2007 07:51

Русский текст из xml, формата win1251, не отображает
 
Приветстсвую. Я много в поиске читал, и в Чаво посмотрел.. Кроме System.useCodePage ничего путного не нашел... Или просто темы двухгодичной давности так и не решенные нормально (наверно участники в привате дальше говорили =] )
У меня есть на сервере файл xml, он для гостевой. Его формат win1251, в него php записываются данные, русский текст, но когда ролик грузит этот xml файл в себя, то вместо русского текста там типичные квадратики... А если весь xml файл из русского текста (ну теги конечно латиницей написаны) то он вобще не отображается в ролике. Вопрос:
Каким образом заставить Flash читать русский текст из xml файла, не используя System.useCodePage, и не переделывая файл в Юникод кодировку?

Kikasso 02.04.2007 08:03

Публикуя под 5-й плеер.))
А что мешает конвертнуть на сервере? Волшебное слово iconv ( функция php)
Не хотите конвертить, useCodePage.
Цитата:

iconv
(PHP 4 >= 4.0.5, PHP 5)
iconv -- Преобразовывает символы строки в другую кодировку
Описание
string iconv ( string in_charset, string out_charset, string str )
Производит преобразование кодировки символов строки str из начальной кодировки in_charset в конечную out_charset. Возвращает строку в новой кодировке, или FALSE в случае ошибки.
Если добавить //TRANSLIT к параметру out_charset будет включена транслитеризация. Это означает, что вслучае, когда символа нет в конечной кодировке, он заменяется одним или несколькими аналогами. Если добавить //IGNORE, то символы, которых нет в конечной кодировке, будут опущены. Иначе, будет возвращена строка str, обрезанная до первого недопустимого символа.
Код:

<?php
echo iconv("Windows-1251", "UTF-8", "Пора переходить на юникод.");
?>


etc 02.04.2007 12:53

У меня вопрос: зачем вообще что-то делать с кодировкой? Зачем её мурыжить и создавать себе проблемы? Почему формат xml именно win, а не utf?
Ответ на вопрос в первом посте: с помощью AS3.

MINASTIS 02.04.2007 14:52

__etc формат такой, как я ранее говорил, потому что "даже если поставить utf, php скрипт кодировку файла изменяет самолично на win, когда используешь параметр 'w' открытия файла", поэтому я ищу выход, как же считать из кодировки win, потому как сохранить эту кодировку utf файла невозможно (из-за интересного php скрипта который самолично кодировку изменяет =( ).

Каким образом с помощью AS3? Есть ли где-нибудь статейка на эту тему?

CorC 02.04.2007 14:55

я все время считываю и из текстовиков и из MySQL
где и там и там стоит utf-8
но ни разу еще php мне менял кодировку
если что то iconv поможет

MINASTIS 02.04.2007 15:14

Вот у меня просто волшебный php скрипт! Я только что файл сохранил в Юникоде, запустилд скрипт добавления через гесту, написал по русски. Мало того, что у меня геста не получает подтверждение загрузки LoadVars-a (так и остается на одном фрейме, хотя аглицкими буквами когда пишу все ок), так она отказывается загружать русский текст из файла. Странно, сказал я себе. Вроде кодировка Юникод... Смотрю, а файл уже кодировки win! Как так получилось не понимаю! Волшебный скрипт млин. Вот посмотрите его код, может найдете чего он мне файл кодировку меняет:
Код:

<?php
$filename = "guest/book.dat";
$fd = fopen($filename, "r");
$prev = fread($fd, filesize($filename));
fclose($fd);
$allm = "<post date='".$_GET['_date']."' name='".$_GET['_nick']."' page='".$_GET['_page']."' mail='".$_GET['_mail']."'>".$_GET['_message']."</post>";
$addall = $allm.$prev;
$fd = fopen($filename, "w");
fwrite($fd, $addall);
fclose($fd);
?>

Вот код вызова скрипта через LoadVars во флеше:
Код:

stop();
var script:LoadVars = new LoadVars();
trace(_page+"_"+_mail);
//if (_page==undefined) _page="-";
script.load("guest.php?_nick="+_nick+"&_date="+_date+"&_mail="+_mail+"&_page="+_page+"&_message="+_message);
script.onLoad = function (ok:Boolean):Void {
        if (ok) {
                play();
        }
}

Вроде все правильно. Но в чем тогда ошибка? Что php творит с кодировкой и почему флеш не читает файл?

etc 02.04.2007 15:15

Цитата:

Сообщение от MINASTIS
"даже если поставить utf, php скрипт кодировку файла изменяет самолично на win, когда используешь параметр 'w' открытия файла"

Сказки. php ничего не преобразовывает при записи.
Ищи ошибку внутри флеша, где-нибудь, да useCodepage включен.

MINASTIS 02.04.2007 15:23

__etc я даже самолично написал System.useCodepage = false вначале.
Ничего не дает =(
Вот полюбуйтесь. До применения скрипта файл выглядел так (с кодировкой Юникод):
Цитата:

<post date='2.31.2007' name='Минастис' page='-' mail='-'>Кагдила медведы?</post>
После добавления такой же информации он стал выглядеть так:
Цитата:

<post date='2.31.2007' name='Минастис' page='-' mail='-'>Кагдила медведы2 ?</post>яю< - а дальше идут многочисленные "иероглифы"
Что это такое? Как так он взял да изменил символы прошлые? Просто разломал предыдущее сообщение, добавил новое, и превратил все это в другую кодировку =((
Что же делать?

Вобще интереснее всего, что php в "глокую куздру" превращает текст предыдущих сообщений только если писать русским... Может все-таки проблема с этим кодом... Который для русского текста в input?
Код:

fixWMode = function(str) {
    var index = Selection.getCaretIndex();
    var broken = str.split(chr(4));
    for (var i = 1; i<broken.length; i++) {
          broken[i] = String.fromCharCode(1024+broken[i].charCodeAt(0))+broken[i].substr(1);
    }
    var out = broken.join("");
    if (index<out.length-1&&str.length!=out.length) {
          Selection.setSelection(index-1,index-1);
    }
    return out;
}
nick.onChanged = function() {
    this.text = fixWMode(this.text);
};
messag.onChanged = function() {
    this.text = fixWMode(this.text);
};

Ведь именно после с измененных полей идут значения в php файл...

CorC 02.04.2007 16:10

а в 5 строке что за хитрая вещь?
может она все ломает?

etc 02.04.2007 16:11

В самом скрипте в принципе все нормально.
Проблема может быть в хостинге и настройках php.

Отключи transparent и проверь без фикса.

MINASTIS 02.04.2007 18:44

CorC железная логика! =)) Прямо дословно перевел broken(с англ) - сломанный.

__etc также и осталось =(
Но я нашел несколько признаков того, что новые данные php некорекктно записывает (вместо русского текста в новом узле китайские народные иероглифы), а старые (то есть старые узлы с русским) он оставляет как есть...
Вот еще раз ярчайший пример. Прямо сейчас в Notepad++ изменил кодировку на utf-8, сделал загрузку русского текса. Работает. Потом попробовал в гесте добавить сообщение с русским текстом. Предыдущее сообщение в файле осталось нормальным, а новое записалось некорекктно... К тому же кодировка изменилась на ANSI =(((
Нет ну прямо нерешимая какая-то проблема. Так и в Денвере, так и в инете!
Кто-нибудь знает в чем проблема?

ПС. Вот исходник. Может в нем что увидите? Я уже и не знаю чего творить чтобы он нормально с русским работал...
http://lingua.h18.ru/indexx.rar

Там пятый фрейм с гестой

Кстати, может ли быть виной проблемы, что я в xml файле не объявил строчкой кодировку и язык самого xml файла? Как обычно так делают.

Kikasso 02.04.2007 20:30

А из броузера не пробовал отправлять? Сваргань html с формой, проставь ему utf-8 и смотри что получится.

MINASTIS 02.04.2007 20:31

Сейчас попробую... отпишусь через 10-15 минут.

Kikasso 02.04.2007 20:36

добавь еще в пыхпых phpinfo() и посмотри, в какой кодировке приходит, чтоб не оставалось сомнений

MINASTIS 02.04.2007 20:44

Добавляет русский текст отлично, не изменяя и не коверкая старые сообщения. Но кодировку сразу снова с utf-8 на ansi меняет.
Вот что насчет кодировки в phpinfo() выдало
SERVER["HTTP_ACCEPT_ENCODING"] gzip, deflate

Не понимаю. Почему он кодировку изменяет?! Не будь этой проблемы все отлично бы грузило...

Kikasso кстати а ты смотрел мой исходник? Может там я чего намудрил?

Kikasso 02.04.2007 21:52

Если сервер мудрит с кодировками, стало быть он так настроен - ничего с этим не поделаешь. Этим грешит русский апач, я с этим сталкивался - он мне при uploade картинки переконвертировал)). Можно что-то написать в .htaccess, но об этом лучше спрашивать техподдержку хостера. ХЗ. Я пас.

MINASTIS 02.04.2007 22:12

Kikasso =]] Почему только у меня такие проблемы? Ну почему я все делаю и почему-то невидимые ошибки да есть?! =]]
Эх ладно, буду ждать, можеть кто-нибудь знает в чем проблема...
А насчет сервера так я на 3-х хостингах проверял и у себя на Денвере...

ПС. Кстати ты посмотрел исходник? Там все нормально? Может все-таки увидишь, я чего там не так сделал?

Люди помогите пожалуйста! Скажите что у меня не так?

etc 02.04.2007 22:47

Я уже предлагал сменить хостинг.

MINASTIS 02.04.2007 22:56

__etc Имеешь ввиду что и Денвер и два других хостинга имеют одинаковые проблемы?... =0
По моему Денвер то не должен такого делать (ну с кодировкой)...
Ну что же. Попробую. Попробую еще на один бесплатный. Я должен удостовериться что проблема в хостинге, и что не зря буду покупать платный.

etc 02.04.2007 22:57

У меня ничего подобного на том же Денвере не наблюдается.

MINASTIS 02.04.2007 23:01

__etc ты имеешь ввиду ты протестил этот ролик со скриптом у себя и он кодировку не меняет? И русский язык грузит и добавляет? =0
Скажи пожалуйста сайт денвера, я скачаю новую версию.

etc 02.04.2007 23:06

Не тестил, но по приведенному коду такого наблюдаться не должно.
Сайт http://www.denwer.ru

MINASTIS 03.04.2007 14:05

Попробую денвер новый скачать. Если не поможет придется не Xml файл записывать, а как все делают-записывать сообщения через определенный символ, и после по нему в php разделять и выводить.

__etc не помогло... Хм.. что то по моему во флеше не то... Самое интересное в том, что он и в ANSI кодировке читает русский текст, но только если добавлять после русского английские сообщения. Только добавляю русское сразу все предыдущие сообщения превращаются в куча бредовых символов (точнее русский язык в пред. сообщениях). Ты не смотрел исходник? Там все нормально сделано?

Люди подскажите пожалуйста тогда ссылки на исходники гостевых книг схожего с моей характера.
Интересно проверить будут ли они так же глючить или нет. Может по другому придется тогда делать гесту...

Не сочтите за флуд, ибо никто так и не отвечает...
Кроме как во флеше я ошибки не могу нигде подозревать... Денвер новый даже скачал все равно не работает правильно с русским языком.

Может кто-нибудь пожалуйста посмотреть мой исходник, и сказать, на 5-ом фрейме без ошибок загрузка и сохранение данных сделаны в гостевой книге? Или есть там что-то что мешает правильной работе гесты?

Kikasso 03.04.2007 21:20

Спокойнее, друг. Посмотрим.

etc 03.04.2007 21:33

Вот тебе гостевые:

http://flasher.ru/src/kind/%7Bset.cat=36%7D

Kikasso 03.04.2007 21:38

1) Это новый исходник или старый? Что там опять с useCodepage? Совсем убери. закомментируй что-ли
2) pole.htmlText += ".." в цикле принципиально неправильно. Пишите
Код:

str = pole.htmlText;
// Далее в цикле
str +=  ".." ;
// Цикл окончен
pole.htmlText = str;

Потому что htmlText - это getter/setter, и это неоправдано жрет ресурсы, и к тому же добавляются лишние тэги "<p>"
3) вот эта конструкция:
Код:

this.createEmptyMovieClip("clip"+i,this.getNextHighestDepth());
        this["clip"+i]._x = this.thisx;
        this["clip"+i]._y = this.thisy;
        this["clip"+i].createTextField("pole",3,0,0,550,10);
        this["clip"+i].pole.textColor = 0x212534;
        this["clip"+i].pole.multiline = true;
        this["clip"+i].pole.wordWrap = true;

Почему не написать проще?
Код:

var clip = this.createEmptyMovieClip("clip"+i,this.getNextHighestDepth());
        clip._x = this.thisx;
        clip._y = this.thisy;
        var pole = clip.createTextField("pole",3,0,0,550,10);
        pole.textColor = 0x212534;
        pole.multiline = true;

Побережем ресурсы!
И уберите wmode=transparent. Где кстати форма для отправки сообщений? Что-то я ее не нашел. А так ошибок пока не вижу, так, замечания.

upd: Вот это что-ли?
Код:

script.load("guest.php?_nick="+_nick+"&_date="+_date+"&_mail="+_mail+"&_page="+_page+"&_message="+_message);
используйте sendAndLoad вместо load.
Еще момент - всем приходящим данным в php надо делать trim(), а то получите сообщение из пробелов, переводов каретки или еще чего похуже.

MINASTIS 03.04.2007 21:42

__etc не сочти за невежество... Но эти гостевые я просматривал два дня назад, и у них немного другая система... У них не xml а loadVariablesNum и еще чего-то...

Kikasso все изменил с htmlText и там подрихтовал... А так весь код правилен загрузки гесты? И отправки сообщения?

Kikasso sendAndLoad я поставил так он не захотел принимать onLoad тогда. Просто не проигрывал дальше. Не хочет sendAndLoad работать.
А вот trim()... В каких случаях сообщения могу придти с кучей пробелов переводов картетки и др.? В тех если юзер самостоятельно захочет так написать?

Kikasso 04.04.2007 00:36

Кроме юзеров бывают кулхацкеры, и таких полно. Эта операция обходится дешево, так что
Код:

@$text = trim($_POST['text']);
и не сомневайся. Собака - чтобы подавить возможный warning.
sendAndLoad:
Код:

my_lv.sendAndLoad( "somefile.php", my_lv );
тут есть момент.. Это класс LoadVars, а тебе нужен в ответ XML.
Значит
Код:

my_xml = new XML();
my_lv.onData = function( src ){
my_xml.parseXML( src );
show_messages( my_xml );
}

Ясен принцип?
Или сразу формируй и посылай xml, это чуть сложнее вкурить, зато правильнее.

MINASTIS, чем вы пользуетесь для верстки?? вот это что вообще такое:
Код:

</textarea></form></title></comment></a></div></span></ilayer></layer></iframe></noframes></style></noscript>
</table></script></applet></font>

Я не понимаю как это вообще открывается.
И что за джаваскрипт для впечатывания флеша?? Используйте проверенный: http://blog.deconcept.com/swfobject, но только после того как все заработает просто в object/embed.
И transparent уберите.
upd: ник нечаянно

MINASTIS 04.04.2007 14:01

Kikasso я делаю public во флеше. А тот код который ты показал добавляет хостинг, то есть рекламу.
Вот мой код впечатывания:
Код:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="100%" height="100%" id="indexx" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="indexx.swf" /><param name="quality" value="high" /><param name="wmode" value="transparent" /><param name="bgcolor" value="#666666" /><embed src="indexx.swf" quality="high" wmode="transparent" bgcolor="#666666" width="100%" height="100%" name="indexx" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

Что-то не совсем понял принцип... Я LoadVars использую только чтобы переменные передать в php скрипт, зачем XML получать?
XML я получаю сначала из другого XML объекта... Когда сообщения загружаю.
Или я совсем не так все понял?...

ПС. И прошу хватит мой ник коверкать. То Minastic то Minastys. Правильно Minastis.

Kikasso trip не работает... =(
Я делаю
Код:

@$addall = trip($addall);

etc 04.04.2007 15:46

Цитата:

Сообщение от MINASTIS
Kikasso trip не работает... =(
Я делаю
Код:

@$addall = trip($addall);

Монитор нужно протирать :))
Прочитай пост Kikasso ещё раз.

MINASTIS 04.04.2007 18:43

__etc а там же $_POST... Дошло =)))

ПС. Эй и кстати вы что все сговорились такие аватары ставить с двумя буквами?! =))

etc 04.04.2007 18:46

Цитата:

Сообщение от MINASTIS
__etc а там же $_POST... Дошло =)))

Не дошло. Хотя и это тоже. Название функции trim.

з.Ы. Сговорились.

MINASTIS 04.04.2007 18:58

Название это я на форуме опечатку сделал, так то написал trim

Теперь он мне вобще просто файл очищает и не записывает в него ничего =(
Вот код:
Код:

<?php
$filename = "guest/book.dat";
$fd = fopen($filename, "r");
$prev = fread($fd, filesize($filename));
fclose($fd);
$allm = "<post date='".$_GET['_date']."' name='".$_GET['_nick']."' page='".$_GET['_page']."' mail='".$_GET['_mail']."'>".$_GET['_message']."</post>";
$addall = "$allm$prev";
$addall = stripslashes($addall);
@$addall = trim($_POST['addall']);
$fn = fopen($filename, "w");
fwrite($fn, $addall);
fclose($fn);
phpinfo();
?>

Что я снова намудрил? =(

P.S. Такие аватары показатель чего-то или просто для красоты?...

etc 04.04.2007 19:10

Ну правильно, ты берешь addall из POST-массива, а его нет. Следовательно, $addall пуст (ошибки нет в силу @ перед выполнением).

MINASTIS 04.04.2007 19:16

__etc ты имеешь ввиду что эту строку надо после добавления в файл ставить?...

Может ли быть не восприятие русского языка из-за вот этих строчек в странице с роликом?
Код:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=koi8-r" />

И как же все таки и после чего использовать trim с $_POST?

Kikasso 04.04.2007 20:44

Вот из- за чего русские буквы не работают: wmode="transparent"
trim работает просто:
Код:

<pre>
<?php
$txt = "\n\t bla-bla \n\tеще текст \r\n";
echo "----------------------\n";
echo $txt;
echo "\n----------------------\n";
echo trim($txt);
echo "\n----------------------";
?>
</pre>

Обрезает все пробельные символы сначала и с конца.
http://www.php.net/manual/ru/function.trim.php
За ник сорри, случайно.
А насчет рекламного кода.. Что-то я не нашел открывающих тегов, только закрывающие. Наверное это у меня максон так рекламу вырезал, не вполне корректно.
Чарсет страницы не должен вроде влиять на флешовые дела, у меня нормально уникодом посылалось. Хотя если шлешь GET'ом..

Цитата:

Сообщение от MINASTIS
Вот мой код впечатывания:
Код:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="100%" height="100%" id="indexx" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="indexx.swf" /><param name="quality" value="high" />
<param name="wmode" value="transparent" /><param name="bgcolor" value="#666666" /><embed src="indexx.swf" quality="high"
 wmode="transparent" bgcolor="#666666" width="100%" height="100%" name="indexx" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>


Выделеное убери - это корень зла в данном случае.
Цитата:

Сообщение от MINASTIS
Что-то не совсем понял принцип... Я LoadVars использую только чтобы переменные передать в php скрипт, зачем XML получать?
XML я получаю сначала из другого XML объекта... Когда сообщения загружаю.

Тогда все нормально. Используй sendAndLoad, тем более что POST не кешируется.

MINASTIS 04.04.2007 21:07

Хм... Попробовал сделать так:
Код:

<?php
$filename = "guest/book.dat";
$fd = fopen($filename, "r");
$prev = fread($fd, filesize($filename));
fclose($fd);
$allm = "<post date='".$_GET['_date']."' name='".$_GET['_nick']."' page='".$_GET['_page']."' mail='".$_GET['_mail']."'>".$_GET['_message']."</post>";
$addall = "$allm$prev";
$gonnatrim = $addall;
$addall = trim($gonnatrim);
$addall = stripslashes($addall);
$fn = fopen($filename, "w");
fwrite($fn, $addall);
fclose($fn);
?>

Что-то не удаляет он \n и \r... =((

Так флешка и не воспринимает русский язык... Совсем нивкакую не хочет... =((
Я изменил чарсет дык он вобще перестал принимать подтверждение загрузки php скрипта. Пришлось снова на koi переписать. >=[

Есть еще мысли что же с русским языком произошло у меня нас странице?...

Ты имеешь ввиду
Код:

script.sendAndLoad("guest.php?_nick="+this._nick+"&_date="+this._date+"&_mail="+this._mail+"&_page="+this._page+"&_message="+this._message, script);
script.onLoad = function (ok:Boolean) {
        if (ok) {
                play();
        }
}

?

Кстати, почему сразу корень зла? (я убрал уже). Ведь благодаря этому в гесте пока никто не сможет писать на русском. Сейчас только символ на русском и вся геста слетит =(( Со всеми сообщениями!

Kikasso 04.04.2007 21:43

Код:

@$date = $_POST['_date'];
$date = ( isSet( $date ) && trim($date) != "" ) ? trim($date) : "" ;
// почему кстати не gmdate? Время по гринвичу, как использовать см. http://www.php.net/manual/ru/function.gmdate.php
//ну и так далее, можно без собачки:
$nick = ( isSet($_POST['_nick']) && trim($_POST['_nick']) != "" ) ? trim($_POST['_nick']) : "anonimous";
$message = ( isSet($_POST['_message']) && trim($_POST['_message']) != "" ) ? trim($_POST['_message']) : "нет текста";
// а теперь можно все складывать.

Вот так использовать trim.
Код:

script:LoadVars = new LoadVars();
script._nick = this.nick;
script._date = this._date;
script._mail = this._mail;
script._page = this._page;
script._message = this._message;
script.onLoad = function (ok:Boolean) { if(ok) play(); }
script.sendAndLoad("guest.php", script )

Вот что имею в виду. Вполне возможно, что GET сервак перекодирует.
Чтобы не вводили чего не попадя, есть свойство текстового поля restrict. Данные лучше подрезать перед отправкой, но это не так просто - trim во флеше не найден. Но написан.

etc 04.04.2007 22:00

Kikasso, а где у тебя указан режим POST?

MINASTIS 04.04.2007 22:00

Он не хочет без добавлений в адрес переменных эти переменные принимать. Ты показал как использовать trim и время правильное сделать?
Кстати если это действительно Get сервер перекодирует то тогда как это исправить?


Часовой пояс GMT +4, время: 06:34.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.