我正在编写一个 ColdFusion 程序,该程序使用cfquery
从 AS/400 iSeries 表中获取数据,然后将该数据输出到网页。有时数据是中文的,但它不能正确输出中文字符。
我构建了下面的查询进行测试,
<cfprocessingdirective pageEncoding="UTF-8" />
<cfquery name="Test" Datasource = "AS400">
select dsc1 from sales where ref = '123456'
</cfquery>
<cfoutput>#test.dsc1#</cfoutput>
结果应该是"M5方头螺栓",但我只得到"M5"。 我做了另一个测试运行只是:
<cfset x = "M5方头螺栓"/>
<cfoutput>#x#</cfoutput>
它显示中国人没有问题。
由于 ColdFusion可以在代码中写出字符时显示字符,但在通过 SQL 获取数据时不能显示字符,因此问题似乎出在我的 ODBC 设置或 ColdFusion Server 数据源设置上,但我对这些设置不够熟悉,不知道需要更改哪些内容才能使其正常工作。
在注释中找到并讨论了解决方法。在此处添加一些详细信息,作为此页面未来访问者的答案。
处理 Unicode(中文)字符时有几个注意事项:
- 数据库表的数据类型必须设置为
nvarchar
- 表单处理脚本 (CFML) 必须设置为
utf-8
- 我相信 ColdFusion 默认为此,但您可以指定设置以确保。
例如:<cfprocessingDirective pageEncoding=”utf-8″>
- 我相信 ColdFusion 默认为此,但您可以指定设置以确保。
- 在 ColdFusion 数据源设置中启用"字符串格式"
- 在 ColdFusion 管理员数据源设置下,选择您正在使用的相应数据源。然后单击"显示高级设置"按钮。这将为为非拉丁字符配置的数据源显示"字符串格式">启用高 ASCII 字符和 Unicode的选项。选择此选项并保存数据源。
OP 的问题是他们使用的是 ODBC 数据源,并且"字符串格式"选项不可用。经过一些研究,并且没有找到为该设置配置 ODBC 数据源的任何方法,我建议尝试使用 ColdFusion 附带的"DB2 通用数据库"的内置 JDBC 驱动程序。切换到该驱动程序解决了 OP 的此问题。
从评论
好信息。虽然是"启用字符串格式..."有必要在 CF10+ 中增加对cf_sql_nvarchar的支持吗?– @Leigh
我相信 Leigh 是正确的,新版本的 ColdFusion(10 及更高版本)对 nvarchar 字段有更好的支持。
另外需要注意的是,看起来一些旧版本的 ColdFusion 并不总是与已安装的 DB2 通用驱动程序一起使用,而且看起来旧的标准版本甚至没有它,我不确定较新的版本是否也有它,但是将"其他"选项与 jt400.jar一起使用,也应该有效。- @MHall
您已经证明了 CF 可以正确输出 UTF-8 字符。您是否尝试过在数据库控制台或 UI 中运行该查询?你得到正确的字符吗?
如果字符存储为 VARCHAR 而不是 NVARCHAR,那么您无能为力。数据必须首先正确存储。
如果字符正确存储在数据库中,请尝试在请求顶部添加<cfprocessingdirective pageEncoding="utf-8">
。CF 应该使用 defualt 的UTF-8
,但如果由于某种原因不是,这将强制使用正确的字符集。