Как отправить параметры с одинаковой кодировкой из JavaScript? - PullRequest
1 голос
/ 12 апреля 2010

У меня есть файл javascript, который многие люди встроили в свои страницы. Поскольку я размещаю файл, у меня есть контроль над этим файлом javascript; Я не могу контролировать способ его встраивания, потому что многие его уже используют.

Этот файл javascript отправляет запросы GET моим сервлетам, а параметры, переданные с запросом, записываются в БД. Например, javascript отправляет запрос в http://myserver.com/servlet?p1=123&p2=aString, а затем в сервлет записывает записи 123 и aString в БД.

Перед отправкой строк я использую encodeURIComponent() для кодирования. Но я понял, что каждый клиент отправляет одну и ту же строку с разными кодировками, в зависимости от того, какой браузер или какой сайт он посещает. В результате одни и те же строки представляются разными символами, когда он достигает сервлета (поэтому они являются разными строками).

То, что я пытаюсь сделать, - это преобразовать строки в один вид кодирования из javascript, чтобы при достижении клиентом одинаковые слова представлялись одинаковыми символами.

Как это возможно?

PS. Если есть способ преобразовать кодировку из Java, это также применимо.

Редактировать: Если быть более точным, я выбираю несколько слов со страницы и отправляю их на сервер. Именно здесь кодирование вызывает проблемы.

Редактировать 2: Я НЕ отправляю (и не могу отправлять) запросы GET через XMLHttpRequest, потому что домены разные. Я использую добавление тега script к head методу, упомянутому @streetpc.

Редактировать 3: В данный момент я очищаю строки, заменяя не-ASCII символы на стороне javascript, но у меня есть ощущение, что это не тот путь:

function sanitize(word) {
    /*
    ğ : \u011f
    ü : \u00fc
    ş : \u015f
    ö : \u00f6
    ç : \u00e7
    ı : \u0131
    û : \u00fb
    */
    return encodeURIComponent(
            word.replace(/\u011f/g, '_g')
                .replace(/\u00fc/g, '_u')
                .replace(/\u00fb/g, '_u')
                .replace(/\u015f/g, '_s')
                .replace(/\u00f6/g, '_o')
                .replace(/\u00e7/g, '_c')
                .replace(/\u0131/g, '_i'));
}

Ответы [ 2 ]

3 голосов
/ 12 апреля 2010

Я понял, что каждый клиент отправляет одну и ту же строку с разными кодировками

Хотя это было бы нормально для <form> представлений, это не должно происходить для работы XMLHttpRequest. Функция encodeURIComponent явно всегда записывает байты UTF-8 в кодировке URL, независимо от кодировки страницы, с которой она использовалась. Конечно, убедить ваш контейнер сервлетов позволить вам читать эти байты UTF-8, не путаясь с ними, - это другая история, но это не должно зависеть от клиента.

Что может быть проблемой, если вы используете необработанные символы не ASCII внутри самого файла скрипта. В этом случае интерпретация этих символов будет варьироваться в зависимости от кодировки, используемой браузером для загрузки сценария. На это может повлиять:

  1. любая кодировка, объявленная в заголовке Content-Type: text/javascript;charset=.
  2. любой атрибут charset, объявленный в элементе <script src="..." charset="...">.
  3. кодировка страницы, которая включала скрипт.

(1) и (2) поддерживаются не во всех браузерах. Обычно вы можете положиться на (3), но как сторонний автор сценария, который находится вне вашего контроля. Поэтому вы должны использовать только символы ASCII в вашем скрипте. (Используйте \u1234, чтобы обойти это ограничение, чтобы включить не-ASCII символы в строковые литералы в вашем скрипте.)

2 голосов
/ 12 апреля 2010

Вы указываете кодировку файла JavaScript в заголовках HTTP? Как, например, Content-type: text/javascript; charset=utf-8 с beign-файлом .js, сохраненным в UTF-8. С помощью Apache вы можете настроить

AddCharset utf-8 .js 

Или вы можете заставить размещенный файл javascript создать еще один тег script с параметром charset='utf-8' и добавить его к элементу head (как это делают большинство букмарклетов).

Я думаю, что JavaScript, интерпретируемый как код UTF-8, должен затем получать / манипулировать строками UTF-8.

Затем в вашем Java-сервлете вы можете указать используемую кодировку ввода:

request.setCharacterEncoding("UTF-8");

Редактировать: проверить эту страницу о Кодировка символов в JavaScript , особенно часть под названием «Настройка кодировки символов».

...