Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: & опознается не как служебный символ в кодировке  (Прочитано 13352 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nik0101
Гость
« : 07-06-2009 13:46 » 

Здравствуйте! не могу справиться с проблемой. задача выглядить следующим образом. есть многоязычный  (рус,англ,фр,нем..) PHP+JavaScript. Массив werte[] создается PHP скриптом и выглядить вот так:  Buffer[0]= Array('&#10хх;&#10хх;&#10хх;&#10хх;&#10хх.... )...   количество элементов массива в конретном случае своя и этот массив используется повсюду по скрипту в разных интрепретациях. Массив во всех своих применениях отражается корректно, кроме одного случая. Есть в скрипте случай, когда необходимо элементы массива в <SELECT> .... </SELECT> отражать. Это делается для того чтобы клиент мог менять местами элементы массива... ПРоблема в том, что когда установлен русский язык, в SELECT каждый OPTON отображается в виде  &#10хх;&#10хх;&#10хх;&#10хх;&#10хх.... Причем, HTML Конструкция SELECT геренируется JAvaScript-ом. Следующей конструкцией:   

Код:
for (var i=0; i<k; i++)
{
knoten = document.createElement("option");
knoten.value = Buffer[i][2];
objalt.appendChild(knoten); // (ф)
text = document.createTextNode(Buffer[i][0]);
knoten.appendChild(text);
}

вот после этого фрагмета кода, например символ &#10хх;, превращается в $amp;#10xx;
незнаю, смогли описать проблему корректно, если что не понятно не пинайте. как решить проблему? в точке Ф делал распечатку, массив Buffer[i].. отображается корректно. После методов createTextNode(), appendChild() & превращается в &amp; .  как это происходить не пойму...спаисбо.
« Последнее редактирование: 08-06-2009 13:46 от RXL » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 08-06-2009 13:53 » 

nik0101,
1. "превращается" где? В buffer или в text-node?
2. В каких браузерах так происходит?

Не лучше ли будет генерить js-файл в utf-8 (соотв., надо header('Content-type: application/x-javascript; charset=utf-8')Ага и не мучить себя неудобоваримыми конструкциями?

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nik0101
Гость
« Ответ #2 : 09-06-2009 05:34 » 

nik0101,
1. "превращается" где? В buffer или в text-node?
до выполнения этой конструкции text = document.createTextNode(Buffer...); массив Buffer имеет нормальную кодировку, т.е. &#10хх;. Пока незнаю как заглянуть в Текстовый объект. Но по резульататм  сужу, что преобразование & в &amp; происходить или при создании text или при  appendChild(text).

2. В каких браузерах так происходит?
эту страницу вызываю в броузерах IE7 и FF3. результат одинаковый. Жаль



... генерить js-файл в utf-8 (соотв., надо header('Content-type: application/x-javascript; charset=utf-8')Ага ....
разве не достаточно указать следующее а начале страницы :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ?
Записан
nik0101
Гость
« Ответ #3 : 09-06-2009 06:23 » 

Поставил к своей
Записан
nik0101
Гость
« Ответ #4 : 09-06-2009 06:30 » 

Поставил к своей FF3.0 Firebug.  В объекте select->option->text сидить строка с нормальной кодировкой - &#10xx; итд. А в select->option->innerHTML сидить кодировка в виде &amp;#10xx;.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 09-06-2009 08:55 » 

1. Очень непонятно говоришь. Конечно, позже немного понятнее написано.

В общем, судя по всему, значения узлов и атрибутов — в натуральном виде, не XML/HTML-кодированные.

2. Хорошо, что одинаково.

3. Нет, не достаточно — тип документа обязательно должен указываться в заголовке HTTP, а кодировку веб-серверы тоже часто подставляют и чтобы не было конфликтов в браузерах, надо ее там принудительно указывать.
Мой пример заголовка был для отдельного (не встроенного в HTML-документ) JS-файла.

Кстати, не понятно: если у тебя документ кодирован в UTF-8, то зачем ты пишешь громоздкими конструкциями &#...;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nik0101
Гость
« Ответ #6 : 09-06-2009 20:44 » 

"если у тебя документ кодирован в UTF-8, то зачем ты пишешь громоздкими конструкциями &#...;"

все идет из БД...

пока вот так решил проблему

document.getElementById(id).innerHTML = document.getElementById(id).innerHTML.replace(reg, "&");

не красиво...
спасибо за поддержку!
чтобы корректно решить проблему, наверно всю страницу  нужно перелопатить...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 09-06-2009 20:47 » 

nik0101, лучше базу перекодировать - она сразу меньше станет и за одно трафик меньше: сущность в среднем 7 байт, а аналог в UTF-8 - два байта.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nik0101
Гость
« Ответ #8 : 09-06-2009 21:06 » 

но в IE перестал , оказывается, работать. в IE SELECT  список ничего не покзывает.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-06-2009 03:41 » 

nik0101, на будущее: тестить надо в большем количестве браузеров - в большинстве распространенных. На сегодняшний день сюда стоит отнести: IE[678] (более ранние версии не поддерживают DOM), FF[23], Opera9. Желательно еще Chrome и Safari[23].

Посмотри различную статистику:

1. Тут "world wide" апрель 2009. Только марки, без версий.
http://www.oszone.net/9325/April_2009_browser_stats

2. По маркам и версиям за январь 2009.
http://www.trendblog.ru/?p=913

3. Liveinternet.ru. За год.
http://www.liveinternet.ru/stat/ru/browsers.html?period=month&id=55&id=35&id=18&id=54&id=20&id=49&id=3&id=34&show=%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C+%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA&per_page=10&report=browsers.html%3Fperiod%3Dmonth

А то представляешь, как обидно, когда заходишь на красивый сайт, а он в твоем любимом браузере работает через Ж...
« Последнее редактирование: 10-06-2009 03:43 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nik0101
Гость
« Ответ #10 : 13-06-2009 21:58 » 

Обнаруженное мное решение (document.getElementById(id).innerHTML = document.getElementById(id).innerHTML.replace(reg, "&")Ага - это было не решение, это было латание дыр!!

в поисках оптимального, т.е. натурального решения, вот как мне пришлось переписать вышеуказаный код:

Код:
//Вариант2
        ....
for (var i=0; i<k; i++){
NewOption = document.createElement("option");
NewOption.value = Array[i][2];
NewOption.name = bez + "[]";
NewOption.innerHTML = (Array[i][0]);
objSelect.appendChild(NewOption);
}
        .........

иными словами, прежде я innerHTML в NewOption создавал через text. Вот и мой текст пока попадал в innerHTML перобразовывался до неузнаваемости. В последнем фрагменте кода (Вариант2) innerHTML создется без всяких промежуточных полей, типа  text (см.код Вариант2).
Спасибо тебе RXL, твои слова про красивые сайты не давали мне покоя. наконец-то оптимум нашел, теперь кленты с IE и кленты с FF будуть видеть русские буквы.

Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines