2010-05-04 1 views
4

У моего сайта ColdFusion (MX7 на IIS 6) есть функция поиска, которая добавляет поисковый запрос к URL-адресу, например. http://www.example.com/search.cfm/searchterm.Проблема с использованием юникода в URL-адресах cgi.PATH_INFO в ColdFusion

Проблема, с которой я столкнулся, - это многоязычный сайт, поэтому поисковый запрос может быть на другом языке, например. القاهرة, приводящий к поисковому URL-адресу, например http://www.example.com/search.cfm/القاهرة

Проблема заключается в том, когда я пришел, чтобы получить поисковый запрос из URL-адреса. Я использую cgi.PATH_INFO, чтобы получить путь к поисковой странице и поисковому запросу и извлечь искомый термин из этого, например. /search.cfm/searchterm однако, когда символы Юникода используются в поиске, они преобразуются в вопросительные знаки, например. /search.cfm/??????.

Они представляют собой фактические вопросительные знаки, а не браузер, не умеющий форматировать символы юникода, или их искажают на выходе.

Я не могу найти информацию о том, поддерживает ли ColdFusion код юникода в URL-адресе или как я могу решить эту проблему и получить какой-либо URL-адрес - есть ли у кого-нибудь идеи?

Приветствия,

Том

Редактировать: Дальнейшее исследование привело меня к мысли, проблема может связана с IIS, а не ColdFusion, но мой первоначальный запрос до сих пор стоит.

Далее редактировать

Результат GetPageContext().GetRequest().GetRequestUrl().ToString() является http://www.example.com/search.cfm/searchterm/????? поэтому возникает вопрос идет довольно глубоко.

ответ

3

Да, это не проблема ColdFusion. Это обычная проблема.

Это в основном по вине исходной спецификации CGI, которая указывает, что PATH_INFO должен быть% расшифрованный, таким образом, потери исходных последовательностей %xx байт, которые позволили бы вам работать, какие должны были реальные персонажи.

И это частично ошибка IIS, потому что он всегда пытается прочитать представленные байты %xx в части пути как Unicode с кодировкой UTF-8 (если этот путь не является допустимой последовательностью байтов UTF-8, и в этом случае он plumps для кодовая страница Windows по умолчанию, но не дает вам возможности узнать, что это произошло). Сделав это, он помещает переменные среды в строку Unicode (поскольку envvars Unicode под Windows).

Однако большинство байт-инструментов, использующих C stdio (и я предполагаю, что это относится к ColdFusion, как это происходит в Perl, Python 2, PHP и т. Д.), Затем попытайтесь прочитать переменные окружения в виде байтов, а Среда выполнения MS C снова кодирует содержимое Юникода, используя кодовую страницу Windows по умолчанию. Поэтому любые символы, которые не соответствуют кодовой странице по умолчанию, теряются навсегда. Это будет включать в себя ваши арабские символы при работе в западной установке Windows.

Умный скрипт, который имеет прямой доступ к API Win32 GetEnvironmentVariableW, может вызвать это, чтобы получить переменную среды native-Unicode, которую они могли бы затем кодировать в UTF-8 или что-то еще, что они хотели, предполагая, что вход был также UTF- 8 (это то, что вы обычно хотели сегодня). Однако я не думаю, что CodeFusion предоставляет вам этот доступ, и в любом случае он работает только с IIS6; IIS5.x будет удалять любые символы, не относящиеся к умолчанию, до того, как они достигнут переменных окружения.

В противном случае, ваш лучший выбор - переписывание URL. Если слой выше CF может преобразовать этот search.cfm/القاهرة в search.cfm/?q=القاهرة, то вы не сталкиваетесь с той же проблемой, что и переменная QUERY_STRING, в отличие от PATH_INFO, не указана как% -декодированная, поэтому байты %xx остаются там, где инструмент на уровне CF может увидеть их.

+0

Вы можете использовать параметр реестра FastCGIUtf8ServerVariables, чтобы Path_info и другие переменные были декодированы как UTF-8. –

0

Вы можете установить кодировку символов URL и FORM объема с помощью функции setEncoding():

http://www.adobe.com/livedocs/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000623.htm

Вы должны сделать это, прежде чем получить доступ к любой из переменных в этой области.

Но кодировка по умолчанию этих областей уже является UTF-8, поэтому это может не помочь. Кроме того, это, вероятно, не повлияет на область CGI.

Является ли IIS Server протоколированием правильных символов в журнал запросов?

2

Вот что вы можете сделать:

<cfset url.searchTerm = URLEncodedFormat("القاهر", "utf-8") > 

<cfset myVar = URLDecode(url.searchTerm , "utf-8") > 

Ofcourse, я рекомендовал бы, что вы работаете с чем-то вроде этого в этом случае:

yourtemplate.cfm SEARCHTERM =% C3% 98% C2 % A7% C3% 99% E2% 80% 9E

И затем вы переписываете URL-адреса в IIS (если это еще не сделано каркасом/остальной частью приложения) http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite-module/, чтобы соответствовать вашему шаблону.