Проблема метода 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> |
var Str = "Привет, мир".indexOf("м", 0); // Результата: индекс - 8. alert(Str); Скриншот сделай. |
А, все, понятно. Вот тебе пища для размышлений:
var Str = "Привет, мир".indexOf("м", 0); alert(Str); |
Разобрался. Дело в том, что в браузерах срабатывала кодировка ANSI, а моя страница в UTF-8. Отсюда и проблема вычислений. Когда переключился на utf-8 всё стало правильно вычисляться! )))
|
Спасибо!))
|
Т.е. я в header установил <meta charset="UTF-8">. Теперь браузер автоматически переключается на нужную кодировку и никаких проблем с вычислениями! )
|
Если быть ещё точнее то, строки в JavaScript имеют внутреннюю кодировку Юникод. А покскольку метод indexOf() работает со строками, то можно делать вывод.
|
Внутреннее представление строк не имеет отношения к этой проблеме.
У тебя в документе на каждый символ приходится два байта (так как символы кириллицы в 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. |