我想通过用 <sup>
包裹所有注册符号来使它们成为上标HTML 标签。所以,我可以在 SQL 中毫无问题地做到这一点:
SELECT s.id,
Replace(s.name,'®','<sup>®</sup>') AS name
FROM staff s
WHERE name LIKE '%®%'
结果:
id | name
1 | Name1 CFP<sup>®</sup>, CDFA
2 | Jeffrey test CFP<sup>®</sup>
3 | Matthew hello CFP<sup>®</sup> CFA
但是当我在 Coldfusion 中从 cfquery
运行它时标签,看起来好像 ®
字符被解释为 ®
.
<cfquery name="getStaff" dataSource="#this.dsn#">
SELECT s.id,
Replace(s.name,'®','<sup>®</sup>') AS name
FROM staff s
WHERE 1=1
<cfif isDefined("arguments.permalink")>
AND s.permalink=<cfqueryparam value="#arguments.permalink#" />
</cfif>
</cfquery>
有没有更好的方法来解决这个问题?我最初在 Coldfusion 中使用 <cfset getStaff.name = Replace(getStaff.name,Chr(174),'<sup>®</sup>') />
做到了这一点,在我切换到 Mustache 模板之前效果很好。
我绝对更愿意使用 CHAR()
如果我能找出数字字符 ®
的函数在Mysql中。 (注意,在这个和所有数据库表上使用 utf8_general_ci
)我试过 CHAR(174)
在 Mysql 中,但它不会工作,因为(据我所知)Mysql 没有使用相同的字符集 - SELECT CHAR(174)
返回一个 blob。
最佳答案
更新:
I'd definitely prefer to use the
CHAR()
function if I could figure out what numeric character®
is in Mysql. (Note, using utf8_general_ci on this and all DB tables) I triedCHAR(174)
in Mysql, but it won't work because (as far as I can tell) Mysql isn't using the same character set -SELECT CHAR(174)
returns a blob.
如评论中所述,听起来您的数据库的默认字符集是 utf8
.所以大概它失败了,因为十进制的 174 不是表示 registered sign in utf8 的正确方法。 .该符号需要两个字节。为您的默认字符集(即 utf8)使用正确的十六进制或十进制值,它按预期工作:
- 十六进制:
CHAR(0xC2AE)
- 十进制:
CHAR(194,174)
尽管用USING
明确指定字符集会更好:
- 十六进制:
CHAR(194,174 USING utf8)
- 十进制:
CHAR(0xC2AE USING utf8)
符号是否硬编码到 .cfm 脚本中?如果是这样,则可能是脚本的字符编码问题。在解释文件中的文字字符时,页面编码很重要。尝试:
正在添加
<cfprocessingdirective pageEncoding="utf-8">
到脚本的顶部。
注:For CFC's, thecfprocessingdirective
tag must follow the cfcomponent tagIF 数据库的默认字符集是
utf8
,尝试使用 CF 等效函数,即#chr(174)#
.但是,IMO 最好使用 MySQLChar()
函数代替。
关于 cfqueryparam 的旁注,始终指定 cfsqltype
是一个好习惯.如果省略,则默认为 CF_SQL_CHAR,这可能会强制隐式转换和 cause wrong/unintended results in some cases (数字、日期等)。即使对于字符串值,指定类型也是一个好主意,因为在数据库端处理 CHAR 和 VARCHAR 类型的方式可能略有不同。
关于MYSQL/Coldfusion 替换注册符号不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40770614/