Как кодировать строки в ColdFusion, исключая «точку» - PullRequest
3 голосов
/ 30 марта 2012

Я ищу способ кодирования строк с помощью ColdFusion, но исключая ".". Это то, что я пробовал до сих пор:

<!--- Test area --->
<cfset str="ChrisTilghmanFirstFlash.Eflv">
<cfset str1="Chris Tilghman First Flash.Eflv">
<cfset str2="Chris-Tilghman First_Flash.Eflv">
<cfset enc1 = urlEncodedFormat(str,"utf-8" )>
<cfset enc2 = urlEncodedFormat(str1,"utf-8")>
<cfset enc3 = urlEncodedFormat(str2,"utf-8")>
<cfoutput>#enc1#</cfoutput><br>
<cfoutput>#enc2#</cfoutput><br>
<cfoutput>#enc3#</cfoutput><br>
<!--- END test area --->

urlEncode utf-8 other также кодирует символы «точка», «-» и «_». Как мне предотвратить этот сценарий?

Ответы [ 4 ]

3 голосов
/ 30 марта 2012

Вы можете использовать точку в качестве разделителя списка и кодировать каждый элемент в списке отдельно.Как то так:

<cfset enc1="">
<cfloop list="#str#" index="i" delimiter=".">
  <cfset listAppend(enc1,urlEncodedFormat(i,"utf-8"),".")>
</cfloop>
3 голосов
/ 30 марта 2012

Это решит за вас: -

<cfset str="ChrisTilghmanFirstFlash.Eflv">
<cfset str1="Chris Tilghman First Flash.Eflv">
<cfset str2="Chris-Tilghman First_Flash.Eflv">
<cfset enc1 = urlEncodedFormat(str,"utf-8" )>
<cfset enc2 = urlEncodedFormat(str1,"utf-8")>
<cfset enc3 = urlEncodedFormat(str2,"utf-8")>
<cfoutput>#replace(enc1, "%2E", ".", "ALL")#</cfoutput><br>
<cfoutput>#replace(enc2, "%2E", ".", "ALL")#</cfoutput><br>
<cfoutput>#replace(enc3, "%2E", ".", "ALL")#</cfoutput><br>
2 голосов
/ 03 апреля 2012

Один ответ можно найти в этой теме , которая

. Используйте функцию ReplaceList () ColdFusion, чтобы "исправить" ошибки, допущенные URLEncodedFormat (), чтобы произвестистрока, закодированная в соответствии с RFC 3986.

Код:

<cfset string = replacelist(urlencodedformat(string), "%2D,%2E,%5F,%7E", "-,.,_,~")>
0 голосов
/ 18 апреля 2016

(слишком долго для комментариев ...)

Я наткнулся на эту тему, пытаясь реализовать кодировку RFC 3986 . Если вы используете более новую функцию encodeForURL (вместо urlEncodedFormat ), она немного приблизит вас, но все же потребует несколько настроек.

Согласно RFC 3986:

  • Незарезервированные символы, которые не должны быть экранированы: ALPHA / DIGIT / "-" / "." / "_" / "~" /
  • Пробелы должны быть закодированы как %20 вместо +
  • Зарезервированные символы, которые следует экранировать, включают: : / ? ## [ ] @ ! $ & ' ( ) * + , ; =

Чтобы результаты EncodeForURL были совместимы:

  • Принудительное кодирование звездочки "*" (зарезервированный символ)
  • Обратное кодирование тильды "~" (должно кодироваться , а не ).
  • Изменить кодировку пробела с "+" на "% 20":

Код:

encodedText = encodeForURL("space period.asterisk*");
encodedText = replaceList( encodedText , "%7E,+,*", "~,%20,%2A");
...