UTF-8 Server.UrlEncode проблема в ASP Classic - PullRequest
2 голосов
/ 05 марта 2009

У меня немного беспокоит URL, кодирующий строку текста в кодировке UTF-8 для передачи по HTTP. Я использую Server.URlEncode в классическом ASP (vbscript) для кодирования символа «é».

Создает следующую строку,

% C3% 83% C2% A9

Однако система, с которой я разговариваю по HTTP, - это PHP, и она не может декодировать эту строку. При использовании кодировщика PHP на http://www.albionresearch.com/misc/urlencode.php тот же символ, закодированный с использованием метода кодирования URL-адреса PHP, выглядит как

% Е9

Кто-нибудь знает, как я могу успешно кодировать строки в кодировке UTF-8 в моем ASP, чтобы система PHP могла успешно их декодировать?

Ответы [ 4 ]

4 голосов
/ 05 марта 2009

% C3% 83% C2% A9

Это слишком закодировано: строка записывается как UTF-8, читается обратно как ISO-8859-1, затем снова записывается как UTF-8, а затем кодируется в шестнадцатеричном формате!

% E9

Это слишком мало закодировано: строка записана в виде простого ISO-8859-1 и закодирована в шестнадцатеричном формате. Это нормально, если PHP-скрипт, с которым вы разговариваете, ожидает ISO-8859-1, но современные веб-системы должны поддерживать UTF-8, и в этом случае последовательность должна выглядеть следующим образом:

% C3% A9

(Это правильно закодировано!)

Я использую Server.URLEncode в классическом ASP

Классический ASP, к сожалению, имеет некоторые серьезные недостатки в обработке Unicode. Вы можете установить @ CODEPAGE = 65001 (и Response.Charset = "UTF-8") для создания страниц UTF-8, но ваш внутренний тип строки все еще кодируется в системной кодовой странице, и любые данные, извлекаемые из представлений формы или базы данных, будут быть прочитанным в эту кодировку.

Таким образом, вы можете использовать URLEncode () в виде литерала chr 233, чтобы получить правильный вывод, ОК, но если вы получаете данные из 'é' в кодировке UTF-8 при отправке формы, вы получите ' Ã © '- последовательность UTF-8, неправильно интерпретированная как ISO-8859-1 (фактически cp1252, эквивалент Windows).

2 голосов
/ 10 апреля 2012

Как насчет этого?

Function URLEncodeWithCodepage(value, myCodepage)
    Dim cpOriginal
    cpOriginal = Response.Codepage
    Response.Codepage = myCodepage
    URLEncodeWithCodepage = Server.URLEncode(value)
    Response.Codepage = cpOriginal
End Function

Вы можете использовать его с

encodedValue = URLEncodeWithCodepage(value, 65001) 

чтобы получить кодировку UTF-8

1 голос
/ 22 июня 2012

Добавьте следующее к заголовку ASP-страницы, которая возвращает данные

Response.ContentType = "text/html"
Response.AddHeader "Content-Type", "text/html;charset=UTF-8"
Response.CodePage = 65001
Response.CharSet = "UTF-8"
0 голосов
/ 11 октября 2011

Это была моя работа.

Создайте новый файл ASP, закодированный в JScript (не в VBScript), вызовите его urlEncodeUTF8.asp:

<%@ Language="JScript" %>
<%
    Response.CharSet="UTF-8"
    Response.Write(encodeURIComponent(Request("s")))
%>

В вашем основном ASP-файле напишите этот код:

FUNCTION URLEncodeUTF8(ByVal str)
    URLEncodeUTF8 = ""
    On Error Resume NEXT
    Err.Clear
    postStr = "s=" & Server.URLEncode(str)
    sURL = "http://" & Request.ServerVariables("SERVER_NAME") & "/urlEncodeUTF8.asp"
    SET xmlHTTPObj = CreateObject("MSXML2.ServerXMLHTTP")
    WITH xmlHTTPObj
        .SetTimeouts 2000, 2000, 2000, 5000
        .Open "POST", sURL, false
        .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"
        .SetRequestHeader "Content-Length", Len(postStr)
        .Send postStr
        xmlHttpResponse = .responseText
        IF Err.number=0 AND .Status=200 THEN
            URLEncodeUTF8 = xmlHttpResponse
        END IF
    END WITH    
    SET xmlHTTPObj = NOTHING
    On Error Goto 0
END FUNCTION

Теперь вы можете URLEкодировать вашу строку, используя вышеуказанную функцию:

Response.Write(URLEncodeUTF8("é"))

В этом случае результат будет:

%C3%A9
...