cfinvokeargument со специальным символом не работает в SELECT

У меня есть cfinvoke:

      <cfinvoke component="cfcs.people" method="getPerson">
   <cfinvokeargument name="name" value="José">
</cfinvoke>

И функция:

      <cffunction name="getPerson" access="remote" returntype="any">
    <cfargument name="name" type="string">

    <cfquery name="qry" datasource="#datasource#">
        SELECT id
        FROM people
        WHERE name = <cfqueryparam value="#name#" cfsqltype="CF_SQL_NVARCHAR">
    </cfquery>

    <cfreturn qry>
</cffunction>

У меня есть ряд в people стол с name"José", однако cfinvoke не возвращает эту строку. Любое имя, не содержащее специального символа, работает, но любое имя со специальным символом не возвращает строк.

Что заставляет специальные символы нарушать SELECT, и что я могу сделать, чтобы это исправить?

1 ответ

Решение

Попробуйте вывести только буквальную строку в скрипте .cfm

      José 

Если браузер отображает искаженную строку ниже, значит, это проблема с кодировкой файла, а не с cfinvoke или cffunction

      José 

Чтобы решить эту проблему, установите кодировку UTF-8 в верхней части скрипта:

       <cfprocessingdirective pageencoding="utf-8"> 

Вы также можете изменить его глобально для всего jvm, используя jvm arg -Dfile.encoding=UTF-8.

Стоит отметить, что директиву cfprocessingdirective часто неправильно понимают. Только причина , это необходимо здесь потому , символьная строка Joséвстроен в исходный код cfm. Если эта строка в конечном итоге будет заменена, скажем, полем формы, тогда директива вам не понадобится. Исходный код будет работать без проблем.

      <!--- works in modern versions of CF -->
<cfinvoke component="cfcs.people" method="getPerson">
   <cfinvokeargument name="name" value="#form.name#">
</cfinvoke>

Смотрите также <cfprocessingdirective> и как не использовать это

Другие вопросы по тегам