Классический ASP Request.Form удаляет 8-битный символ - есть ли простой способ предотвратить это? - PullRequest
3 голосов
/ 21 апреля 2011

Мой клиент использует классический ASP-скрипт для обработки формы от стороннего платежного процессора (это последний шаг в последовательности транзакций по кредитным картам, который начинается на веб-сайте клиента, переходит к третьему участника сайта, а затем возвращается на сайт клиента).

Клиент находится в Австрии, и когда одно из полей содержит 8-битный символ (например, когда значение поля равно Österreich), Ö просто удаляется, когда я получаю значение поля стандартным способом; e.g.:

fieldval = Request.Form("country")
If fieldval = "sterreich" Then
    ' Code here will execute
End If

Литеральное значение, которое сторонняя страница представляет собой POSTing, равно %D6sterreich, что Я думаю, предполагает, что POST кодируется в UTF-8.

Запрос POST имеет следующие возможные заголовки:

  • Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  • Content-Type: application/x-www-form-urlencoded

Я ни в коем случае не эксперт по кодированию символов, и я впервые действительно что-то сделал с Classic ASP, так что я немного растерялся.

Из некоторого поиска и поиска в Google я добавил на страницу, обрабатывающую POST, следующее:

<%@ Codepage=65001 %>
<%
Response.CharSet = "UTF-8"
Response.Codepage = 65001
%>

Но это не имеет значения - я все еще теряю этот начальный 8-битный символ. Есть ли что-то действительно простое, о чем я просто не знаю?

Ответы [ 5 ]

2 голосов
/ 21 апреля 2011

Попробуйте добавить следующее в верхнюю часть страницы:

<%
Response.CharSet = "utf-8"
Session.CodePage = 65001
%>
1 голос
/ 03 апреля 2012

Как насчет использования символа Ascii 0 в строке запроса, закодированной как (% 00), можно ли получить все значение без завершения с помощью Ascii 0?

http://localhost/Test_Authentication.asp?token=%13%23%02%00%01%01%00%01%01%05%02%02%03%00%02%02%0A%0A%0A%0A%0A%0A048


Response.CharSet = "utf-8";
Session.CodePage=65001;

var strToken = (Request.QueryString("token").Count > 0)?Request.QueryString("token")(1):"";
1 голос
/ 22 апреля 2011

Оказывается, я шел в неправильном направлении с этим.Рассматриваемый файл ASP был закодирован в UTF-8, который неявно устанавливал Response.CodePage в 65001 - другими словами, явное добавление директивы CODEPAGE не имело никакого значения - и фактически UTF-8источником проблемы была кодировка.

Когда я перекодировал файл в Windows-1252, проблема исчезла.Я вообще не осведомлен о кодировках символов в целом, но я думаю, что ретроспективно %D6 в POST должно было быть моей подсказкой - если я начинаю понимать все правильно, единственный байт 0xD6 равен не действительный символ UTF-8.Может быть, кто-то более знакомый с этими вещами может подтвердить или опровергнуть это.

0 голосов
/ 20 июня 2012

2 простых шага, которые я использовал:

  1. добавить вверху КАЖДОГО файла asp:

    Response.CharSet = "utf-8"

    Response.CodePage = 65001

  2. сохранить каждый текстовый файл ASP в кодировке "ANSI" (НЕ utf-8!) - этот параметр обычно находится в окне "Сохранить"расширенные текстовые редакторы

Если вы сохраните в кодировке utf-8 или не добавите две строки, указанные в верхней части кода, это никогда не будет работать так, как вы предполагали.

0 голосов
/ 21 апреля 2011

@ Бен Данлэп: Попробуйте это вверху страницы -

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>

Обновление
Если вы сделаете Response.Write Request.Form("country"), что будет отображаться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...