Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.07.2013, 18:40
Интересующийся
Отправить личное сообщение для Rodger1956629 Посмотреть профиль Найти все сообщения от Rodger1956629
 
Регистрация: 30.07.2013
Сообщений: 21

Проблема метода indexOf() в разных браузерах!
Привет всем любителям, начинающим и профессионалам Javascript!
На днях столкнулся с такой проблемой и не могу её пока решить. Начну сразу с элементарного примера:

<script>
var Str = "Привет, мир".indexOf("м", 0); //Результата: индекс 8.
alert(Str);
</script>

Как видно из примера результат должен быть 8. Но на самом деле такой результат выдаёт только браузер Chrome 28 и Opera 12.14! FireFox 22.0, InternetExplorer 10 и Safari 5.1.7, выдают результат 14!!! Причём если указать в IndexOf("какой-нибудь - другой символ", 0), то результат тоже отличается от правильного, т.е. в Chrome и Opera вычисления происходят корректно, а в других браузерах в два раза больше: т.е не 5 а 10; не 4, а 8 и т.д... Но если указать в строке поиска первую букву - "П", то индекс 0 отображается как результат во всех браузерах идентично! В чём проблема?!!! Кто мне может подсказать? Может лучше пользоваться не методом indexOf, а каким-нибудь другим?! Буду очень признателен за помощь. Заранее благодарю!

Да, этот скрипт у меня один в html и ничего больше не подключенно. Переменные не переопределяются. Т.е. то что вы видите - то и имеется. Ну разумеется кроме вёрстки самой странице в стандарте html 5. На всякий случай даю полную страницу:

<!DOCTYPE html>
<html>
<head>
<title>ТЕСТ</title>
</head>
<body>
<script>
var Str = "Привет, мир".indexOf("м", 0); // Результата: индекс - 8.
alert(Str);
</script>

</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 30.07.2013, 19:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

var Str = "Привет, мир".indexOf("м", 0); // Результата: индекс - 8.
alert(Str);

Скриншот сделай.
Ответить с цитированием
  #3 (permalink)  
Старый 30.07.2013, 19:23
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

А, все, понятно. Вот тебе пища для размышлений:
var Str = "Привет, мир".indexOf("м", 0);
alert(Str);
Ответить с цитированием
  #4 (permalink)  
Старый 30.07.2013, 19:23
Интересующийся
Отправить личное сообщение для Rodger1956629 Посмотреть профиль Найти все сообщения от Rodger1956629
 
Регистрация: 30.07.2013
Сообщений: 21

Разобрался. Дело в том, что в браузерах срабатывала кодировка ANSI, а моя страница в UTF-8. Отсюда и проблема вычислений. Когда переключился на utf-8 всё стало правильно вычисляться! )))
Ответить с цитированием
  #5 (permalink)  
Старый 30.07.2013, 19:24
Интересующийся
Отправить личное сообщение для Rodger1956629 Посмотреть профиль Найти все сообщения от Rodger1956629
 
Регистрация: 30.07.2013
Сообщений: 21

Спасибо!))
Ответить с цитированием
  #6 (permalink)  
Старый 30.07.2013, 19:27
Интересующийся
Отправить личное сообщение для Rodger1956629 Посмотреть профиль Найти все сообщения от Rodger1956629
 
Регистрация: 30.07.2013
Сообщений: 21

Т.е. я в header установил <meta charset="UTF-8">. Теперь браузер автоматически переключается на нужную кодировку и никаких проблем с вычислениями! )
Ответить с цитированием
  #7 (permalink)  
Старый 30.07.2013, 20:46
Интересующийся
Отправить личное сообщение для Rodger1956629 Посмотреть профиль Найти все сообщения от Rodger1956629
 
Регистрация: 30.07.2013
Сообщений: 21

Если быть ещё точнее то, строки в JavaScript имеют внутреннюю кодировку Юникод. А покскольку метод indexOf() работает со строками, то можно делать вывод.
Ответить с цитированием
  #8 (permalink)  
Старый 31.07.2013, 02:54
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Внутреннее представление строк не имеет отношения к этой проблеме.
У тебя в документе на каждый символ приходится два байта (так как символы кириллицы в utf8 кодируются именно двумя байтами). Но так как браузер не вкурсе что документ в utf8 (чтобы был вкурсе, нужен либо http заголовок Content-Type, либо его эквивалент в html - <meta http-equiv=Content-type> либо тег <meta charset=..>), то он интерпретирует его как cp1251. А это однобайтовая кодировка, поэтому каждый из двух байт utf8 символа интерпретируется как отдельный символ cp1251.

Почему не 16 (8*2), а 14? Потому что символы пробела и запятой в utf8 кодируются одним байтом (как и остальные ascii-символы)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Срабатывание скрипта в разные моменты при загрузки в разных браузерах VitalikPro Javascript под браузер 10 29.12.2011 18:24
Проблемы с событием onmouseover в разных браузерах jsuse Общие вопросы Javascript 4 29.11.2011 18:30
Поведение свойства length в разных браузерах. mihim Общие вопросы Javascript 1 13.08.2011 10:50
АААААААААА!!! Протестируйте пожалуйста код в разных браузерах. выявляем ошибки. prototype Элементы интерфейса 1 22.07.2011 07:47
Некорректная работа скрипта в разных браузерах en-k Общие вопросы Javascript 2 15.03.2011 14:54