Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Проблема метода indexOf() в разных браузерах! (https://javascript.ru/forum/css-html/40291-problema-metoda-indexof-v-raznykh-brauzerakh.html)

Rodger1956629 30.07.2013 18:40

Проблема метода 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>

danik.js 30.07.2013 19:18

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

Скриншот сделай.

danik.js 30.07.2013 19:23

А, все, понятно. Вот тебе пища для размышлений:
var Str = "Привет, мир".indexOf("м", 0);
alert(Str);

Rodger1956629 30.07.2013 19:23

Разобрался. Дело в том, что в браузерах срабатывала кодировка ANSI, а моя страница в UTF-8. Отсюда и проблема вычислений. Когда переключился на utf-8 всё стало правильно вычисляться! )))

Rodger1956629 30.07.2013 19:24

Спасибо!))

Rodger1956629 30.07.2013 19:27

Т.е. я в header установил <meta charset="UTF-8">. Теперь браузер автоматически переключается на нужную кодировку и никаких проблем с вычислениями! )

Rodger1956629 30.07.2013 20:46

Если быть ещё точнее то, строки в JavaScript имеют внутреннюю кодировку Юникод. А покскольку метод indexOf() работает со строками, то можно делать вывод.

danik.js 31.07.2013 02:54

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

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


Часовой пояс GMT +3, время: 22:04.