ColdFusion 2016 конвертирует специальные символы?
После некоторых исследований и работы над CF 2016 я обнаружил одну проблему. Я использую JQuery/Ajax для отправки данных формы. Если я введу полу столбец ;
в одной из моих текстовых областей символы преобразуются в ;
, Я не уверен, что вызывает полуколонца для преобразования в HTML-код. Я проверил форму данных перед отправкой и если я вхожу Test;
в консоли это будет выглядеть так: Test%3B
, Затем я поместил область видимости формы в cfmail поверх моей функции и значение поля формы выглядит следующим образом: Test;
Вот пример, который я создал из своего кода HTML/JQuery:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=10; IE=11" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Test Page</title>
<script type="text/javascript" src="JQuery/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="JQuery/jquery-ui.js"></script>
</head>
<body>
<div id="myContainer">
<form name="myForm" id="myForm" method="POST" action="#" class="frmSubmitData">
<fieldset>
<legend>Test Form</legend>
<div>
<span style="display: inline-block; vertical-align:top; font-weight:bold;">Comments:</span>
<textarea name="my_comments" id="my_comments" row="2" cols="55" required></textarea>
</div>
<div>
<input type="submit" name="frmSubmit" id="frmSubmit" value="Submit" />
</div>
</fieldset>
</form>
</div>
<script>
$('.frmSubmitData').on('submit', function(e){
e.preventDefault();
var formData = $('#myForm').serialize();
console.log(formData);
$.ajax({
type: 'POST',
encoding:"UTF-8",
url: 'Components/myTest.cfc?method=testForm',
data: formData,
dataType: 'json'
}).done(function(obj){
if(obj.STATUS === 200){
console.log(obj.FORMDATA);
}else{
alert('Error');
}
}).fail(function(jqXHR, textStatus, errorThrown){
alert("Error: "+errorThrown);
});
});
</script>
</body>
</html>
и пример функции холодного синтеза:
<cfcomponent>
<cfsetting enablecfoutputonly="yes" showdebugoutput="no" requesttimeout="3600">
<cffunction name="testForm" access="remote" output="true" returnformat="JSON">
<cfmail to="myemail@gmail.com" from="myemail@gmail.com" subject="Test Form Scope" type="text">
<cfloop collection="#form#" item="theField">
<cfoutput>#theField# = #form[theField]#<br></cfoutput>
</cfloop>
</cfmail>
<cfset fnResults = StructNew()>
<cfset fnResults.message = "Record successfully saved.">
<cfset fnResults.status = "200">
<cfset fnResults.formdata = #FORM#>
<cfreturn fnResults>
</cffunction>
</cfcomponent>
За одну заметку до того, как я закончу, этот код работал нормально на CF10, как только мы обновились до CF 2016, эта проблема обнаружилась. Опять же, точно такой же код на стороне клиента использовался до того, как полуколонечные хартии не были преобразованы. Если кто-то сталкивался с такой же проблемой и знает, как это исправить, сообщите мне. Спасибо!
1 ответ
У вас есть проблема с кодировкой! Это сложно понять, но обычно легко решить. Обычно добавление <meta charset="utf-8" />
вашей голове HTML достаточно. Это требует, чтобы посещающие браузеры размещали сообщения в хорошо понятном формате кодировки. Вы можете искать в вашей кодовой базе и искать любой тип кодировки, кроме UTF-8.
Также возможно, что происходит какое-то кодирование, например мера защиты, которая выполняется дважды (один раз перед базой данных и один раз после ее возвращения). Проверьте это. Это должен быть EncodeForHtml(), и он должен выполняться только при печати на странице, а не до того, как он попадет в базу данных. Перейдите непосредственно к базе данных, чтобы увидеть, кодируется ли она до того, как она будет вставлена в базу данных - не просто смотрите на вывод на странице. Это даст вам ключ к пониманию того, где это происходит.