使用ColdFusion从AS/400服务器显示中文字符

3
我正在编写一个使用cfquery从AS/400 iSeries表中获取数据并将该数据输出到网页的ColdFusion程序。有时候数据是中文,但它无法正确输出中文字符。
我建立了下面的查询进行测试:
<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服务器数据源设置上,但我对这些设置不太熟悉,不知道需要更改什么才能使其正常工作。


1
在ColdFusion管理员数据源设置下选择您正在使用的适当数据源。然后点击“显示高级设置”按钮。这将显示一个选项:“字符串格式”_启用非拉丁字符配置的数据源的高ASCII字符和Unicode_。为此数据源勾选该框。正如Adrian所指出的那样,数据必须存储在数据库中的NVARCHAR字段中。 - Miguel-F
我正在使用Coldfusion 2016,我检查了我使用的数据源的高级设置,但没有显示“字符串格式”或任何提到为非拉丁字符配置的数据源启用高ASCII字符和Unicode的选项。有一个选项显示:CLOB     -- 启用长文本检索(CLOB)。 BLOB     -- 启用二进制大对象检索(BLOB)。我测试了这两个选项,但都没有任何区别。我的数据源没有设置为可信源,这会有影响吗? - MHall
啊,是的,ODBC数据源没有那个选项。看看你正在使用的ODBC驱动程序是否可以配置该设置。 - Miguel-F
1
这是一个DB2数据库吗?也许你可以尝试使用提供的“DB2通用数据库”JDBC驱动程序。 - Miguel-F
1
太棒了!这是一次瞎猜,但很高兴它对你起作用了。 - Miguel-F
显示剩余3条评论
2个回答

4

在评论中找到并讨论了一个解决方法。在这里添加一些细节作为未来访问者的答案。

处理Unicode(中文)字符时需要考虑以下几点:

  • 数据库表的数据类型必须设置为nvarchar
  • 表单处理脚本(CFML)必须设置为utf-8
    • 我相信ColdFusion默认使用此设置,但您可以指定该设置以确保。
      例如:<cfprocessingDirective pageEncoding=”utf-8″>
  • 在ColdFusion数据源设置中启用“字符串格式”
    • 在ColdFusion管理员数据源设置下选择您正在使用的适当数据源。然后单击“显示高级设置”按钮。这将显示一个选项“字符串格式”为非拉丁字符配置的数据源启用高ASCII字符和Unicode。选择此选项并保存数据源。

问题在于OP使用了ODBC数据源,而“字符串格式”选项不可用。经过一些研究和未能找到任何配置ODBC数据源的方法,我建议尝试使用随ColdFusion一起提供的“DB2 Universal Database”的内置JDBC驱动程序。切换到该驱动程序解决了OP的问题。

来自评论

好信息。不过在CF10+中增加了对cf_sql_nvarchar的支持,是否需要“启用字符串格式...”? – @Leigh

我确实认为Leigh是正确的,较新版本的ColdFusion(10及更高版本)对nvarchar字段有更好的支持。

还要注意的是,看起来一些旧版的ColdFusion不总是与安装的DB2 Universal Driver配合工作,而较老的标准版本甚至没有它,我不确定较新的版本是否也有它,但使用jt400.jar的“其他”选项也应该可以正常工作。 - @MHall


好的信息。虽然在CF10+中添加了对cf_sql_nvarchar的支持,但“启用字符串格式…”是否必要? - Leigh
另外需要注意的是,一些旧版本的Coldfusion似乎不能始终与安装的DB2 Universal Driver配合使用,并且老的标准版本甚至没有它,我不确定新版本是否有它,但使用jt400.jar的“其他”选项也应该可以工作。 - MHall
好的建议,各位。我会将它们添加到答案中,以便人们可以看到。 - Miguel-F

1

您已经证明了CF可以正确输出UTF-8字符。您尝试在数据库控制台或UI中运行该查询了吗?您得到了正确的字符吗?

如果字符存储为VARCHAR而不是NVARCHAR,则无法做任何事情。数据必须在第一次正确存储。

如果字符在数据库中正确存储,请尝试在请求顶部添加<cfprocessingdirective pageEncoding="utf-8">。CF应该默认使用UTF-8,但如果由于某种原因它没有使用正确的字符集,则这将强制使用正确的字符集。


数据是NVARCHAR类型的。我已经在调试中测试过了,结果是M5。在我的代码中,我有: <cfprocessingdirective pageEncoding="UTF-8" /> 我去掉了 / ,但没有任何区别。我是新手,不知道如何使我的代码在注释时看起来漂亮,对此感到抱歉。 - MHall
@MHall - 评论请使用反引号 :-) - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接