Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Причина неподдержки кириллицы в js-коде (https://javascript.ru/forum/misc/82994-prichina-nepodderzhki-kirillicy-v-js-kode.html)

hdma 23.08.2021 03:11

Причина неподдержки кириллицы в js-коде
 
Привет. Имеется большой сложный словарный скрипт, который делался для работы с латиницей — но при попытке добавить поддержку кириллицы, он не отрабатывает. То есть, когда по умолчанию юзер кликает на слово, набранное латиницей - задействуется приведенная ссылка, из которой апострофы и пробелы заменяются на URI-код:

Код:

<a href='?page=definition&word="+n.replace(/'/g,"%27").replace(/ /g,"%20")+"'>"+n+"</a>
Но если точно так же заменять кириллические буквы на код — почему-то код не срабатывает:

Код:

.replace(/а/g,"%430").replace(/о/g,"%43E")
Может кто знает: действительно ли проблема заключается в этой ссылке, и в ней нужно учесть какие-то особенности при работе с кириллицей — или дело в другом?

Aetae 23.08.2021 03:46

Используй на клиенте encodeURIComponent. На сервере соответствующий decode_uri для языка. Не надо делать своих нестандартных костылей.

hdma 23.08.2021 03:58

То есть, если таким образом заменять буквы — работать не будет, потому что нужен encodeURIComponent? Сам не смогу его добавить и потестировать, потому спрашиваю.

Aetae 23.08.2021 04:22

Может и будет. Всё заисит от кодировки сервера, кодировки js-файла и кодировки html файла. Самые разные сочетания могут породить самые разные варианты кодирования символов и самые разные глюки.
В современном вебе везде используется utf8. Но в utf8 символ "а" кодируется как "%D0%B0", а не как "%430".
encodeURIComponent обеспечивает стандартное кодирование безотносительно, но смысл имеет только если сервер раскодирует также по стандарту.

hdma 23.08.2021 05:09

А имеет значение, если это не сервер, а код приложения? То есть, это в приложении так реализовано, что через ссылку происходит переход к слову. Там тоже utf8, и замена с "%430" на "%D0%B0" изменений не дала.

hdma 23.08.2021 05:17

Интересно, что если перед кириллицей стоит один символ латиницы (например: "fслово") — то переход срабатывает.

Rise 23.08.2021 10:55

hdma,
Попробуй так:
<a href='?page=definition&word="+encodeURIComponent(n).replace(/'/g,"%27")+"'>"+n+"</a>

hdma 23.08.2021 12:32

Спасибо, теперь начал видеть кириллицу в начале списка, но по-прежнему не переходит. Кажется дело в том, что ниже есть другая строка, в которой символы кодируются в обратную сторону:

{a=a.replace(/%20/g," ").replace(/%430/g,"а").replace(/%43E/g,"о").replace(/%27/g,"'"),


Вообще говоря, речь о коде из этого приложения, с редким функционалом перехода по любым словам в тексте и поиска с подстановочными знаками, которые позволяют искать слова, правописание которых неизвестно. Там словарь на 200 тысяч слов очень экономно сделан. Если взглянете, тут по ссылке APK-файл, который можно открыть через любой архиватор — https://disk.yandex.ru/d/amhXyapjX_WA4Q, ну или установить на телефон.

Aetae 23.08.2021 13:30

decodeURIComponent чтоб раскодировать.)

hdma 23.08.2021 13:42

А как правильно записать это в строке? Так? —
{a=a.decodeURIComponent(n).replace(/%20/g," ").replace(/%27/g,"'"),


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