Проблема использования Юникода в URL с cgi.PATH_INFO в ColdFusion - PullRequest
4 голосов
/ 04 мая 2010

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

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

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

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

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

Приветствия

Tom

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

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

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

Ответы [ 3 ]

3 голосов
/ 05 мая 2010

Да, это не вина ColdFusion. Это общая проблема.

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

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

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

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

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

2 голосов
/ 04 мая 2010

Вот что вы могли бы сделать:

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

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

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

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/, чтобы соответствовать вашему шаблону.

0 голосов
/ 04 мая 2010

Вы можете установить кодировку символов 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 правильные символы в журнале запросов?

...