使用ColdFusion显示AS/400服务器上的汉字

使用ColdFusion显示AS/400服务器上的汉字,coldfusion,odbc,ibm-midrange,cfquery,Coldfusion,Odbc,Ibm Midrange,Cfquery,我正在编写一个ColdFusion程序,它使用cfquery从AS/400 iSeries表中获取数据,然后将数据输出到网页。有时数据是中文的,但无法正确输出汉字 我构建了下面的查询以进行测试 <cfprocessingdirective pageEncoding="UTF-8" /> <cfquery name="Test" Datasource = "AS400"> select dsc1 from sales where ref = '123

我正在编写一个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服务器数据源设置上,但我对这些设置不够熟悉,不知道需要更改什么才能使其正常工作。

您已经证明CF可以正确输出UTF-8字符。您是否尝试过在DB控制台或UI中运行该查询?你有正确的字符吗

如果字符存储为VARCHAR而不是NVARCHAR,那么您就无能为力了。数据首先必须正确存储

如果字符正确存储在数据库中,请尝试在请求顶部添加。CF应该通过defualt使用UTF-8,但如果由于某种原因,它没有使用,这将强制使用正确的字符集。

在注释中找到并讨论了解决方法。在此处添加一些详细信息,作为将来访问此页面的答案

在处理Unicode中文字符时,有几个注意事项:

数据库表的数据类型必须设置为nvarchar 表单处理脚本CFML必须设置为utf-8 我相信ColdFusion默认设置为此,但您可以指定设置以确保。例如: 在ColdFusion数据源设置中启用字符串格式
在ColdFusion管理员数据源设置下,选择您正在使用的适当数据源。然后单击“显示高级设置”按钮。这将显示一个选项,用于为非拉丁字符配置的数据源启用字符串格式高ASCII字符和Unicode。选择此选项并保存数据源。 OP的问题是,他们使用的是ODBC数据源,而字符串格式选项不可用。在进行了一些研究并且没有找到任何方法来为该设置配置ODBC数据源之后,我建议尝试使用ColdFusion附带的用于DB2 Universal Database的内置JDBC驱动程序。切换到该驱动程序解决了OP的此问题

从评论中


好消息。虽然是启用字符串格式。。。在CF10+中添加了对cf_sql_nvarchar的支持,这是必要的吗@利

我相信Leigh是正确的,ColdFusion 10和更高版本对nvarchar字段有更好的支持


还要注意的是,一些旧版本的ColdFusion似乎并不总是与已安装的DB2通用驱动程序配合使用,而且旧的标准版本似乎也没有,我不确定新版本是否也有,但使用jt400.jar的另一个选项也应该可以@MHall

在ColdFusion管理员数据源设置下,选择您正在使用的适当数据源。然后单击“显示高级设置”按钮。这将显示一个选项,用于为非拉丁字符配置的数据源启用字符串格式高ASCII字符和Unicode。选中该数据源的复选框。正如Adrian指出的,数据必须存储在数据库中的NVARCHAR字段中。我使用Coldfusion 2016,我检查了我使用的数据源的高级设置,没有显示字符串格式或任何选项,对于配置为非拉丁字符的数据源,启用高ASCII字符和Unicode。有一个选项显示:CLOB-启用长文本检索CLOB。BLOB-启用二进制大对象检索BLOB。我对这两个都进行了测试,但都没有什么不同。我的数据源没有被设置为可信源,这会有什么不同吗?啊,是的,ODBC数据源没有这个选项。查看是否可以使用您正在使用的ODBC驱动程序配置该设置。这是DB2数据库吗?也许您可以尝试使用提供的用于DB2 Universal Database的JDBC驱动程序。太棒了!这是在黑暗中拍摄的,但很高兴它对你有效。数据在NVARCHAR中。我在调试中进行了测试,得到了M5。在我的代码中,我删除了/并且没有区别。我是新手,不知道如何在注释时使我的代码看起来漂亮,很抱歉给您带来不便。@MHall-有关注释,请使用:-好信息。虽然是启用字符串格式。。。在CF10+中添加了对cf_sql_nvarchar的支持,这是必要的吗?还需要注意的是,一些较旧版本的Coldfusion似乎并不总是与已安装的DB2通用驱动程序一起工作,而且它看起来不像较旧的标准版本甚至没有i
t、 我不确定新的版本是否也有,但是在jt400.jar中使用另一个选项也应该可以。大家好。我将把它们添加到答案中,以便人们看到它们。