【问题标题】:How can I get my ColdFusion webservice to consume UTF-8?如何让我的 ColdFusion 网络服务使用 UTF-8?
【发布时间】:2012-05-31 19:11:52
【问题描述】:

我有一个非常简单的 ColdFusion Web 应用程序,它采用一个 URL 参数并将其打印到页面上。但它似乎没有收到 UTF-8 编码的值,即使它是以这种方式发送的。

这是一个来自 Fiddler 的 HTTP 请求:

POST http://blahblahwebservice/getme.htm HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
User-Agent: unicode_post
Host: miscmsuatsw
Content-Length: 14  
Pragma: no-cache
Cookie: CFID=247445; CFTOKEN=305db8322d5cecfb-627BD26F-BC91-0EC2-25E9745308EF96F7

sysopts=ΠΣΩ

这是十六进制的样子(URL 和 HTTP/1.1,带有 2 个 CRLF 和主机剥离):

43 6F 6E 74 65 6E 74 2D 54 79 70 65 3A 20 61 70     Content-Type: ap
70 6C 69 63 61 74 69 6F 6E 2F 78 2D 77 77 77 2D     plication/x-www-
66 6F 72 6D 2D 75 72 6C 65 6E 63 6F 64 65 64 3B     form-urlencoded;
20 63 68 61 72 73 65 74 3D 55 54 46 2D 38 0D 0A      charset=UTF-8..
55 73 65 72 2D 41 67 65 6E 74 3A 20 75 6E 69 63     User-Agent: unic
6F 64 65 5F 70 6F 73 74 0D 0A 48 6F 73 74 3A 20     ode_post..Host: 
-- -- -- -- -- -- -- -- -- -- -- 0D 0A 43 6F 6E     .............Con
74 65 6E 74 2D 4C 65 6E 67 74 68 3A 20 31 34 0D     tent-Length: 14.
0A 50 72 61 67 6D 61 3A 20 6E 6F 2D 63 61 63 68     .Pragma: no-cach
65 0D 0A 43 6F 6F 6B 69 65 3A 20 43 46 49 44 3D     e..Cookie: CFID=
32 34 37 34 34 35 3B 20 43 46 54 4F 4B 45 4E 3D     247445; CFTOKEN=
33 30 35 64 62 38 33 32 32 64 35 63 65 63 66 62     305db8322d5cecfb
2D 36 32 37 42 44 32 36 46 2D 42 43 39 31 2D 30     -627BD26F-BC91-0
45 43 32 2D 32 35 45 39 37 34 35 33 30 38 45 46     EC2-25E9745308EF
39 36 46 37 0D 0A 0D 0A 73 79 73 6F 70 74 73 3D     96F7....sysopts=
CE A0 CE A3 CE A9                                   ΠΣΩ

具体来说,ΠΣΩ 是 CE A0 CE A3 CE A9。

渲染时,我只得到“???”。我知道该页面可以呈现 utf-8,我认为它是在接收这些字节,因为当我将 UTF-8 十六进制字符设置为 U+03A0 等时,它呈现得很好。

为了处理 UTF-8,我的 CF 网页是否缺少某些内容??

【问题讨论】:

  • 0xCEA0 是 UTF-8,0x03A0 是 Unicode / UTF-16。因此,您似乎在显示方面遇到了编码问题。你在 Windows 上吗?我似乎记得控制台默认是 UTF-16...
  • 我在 Windows 上,在我的 MFC C++ 应用程序中使用 CT2A(CP_UTF8, sMyString)。编码非常好。它绝对是 ColdFusion 服务的接收端。我制作了自己的演示 cfm,它运行良好,所以我正在使用的服务存在错误。
  • HTTP 请求正文不正确;非 ASCII 字符需要进行 % 编码

标签: http unicode utf-8 coldfusion


【解决方案1】:

在 CFM 的第一行尝试<cfprocessingdirective pageEncoding="utf-8">。

如果它有效,您应该切换到像 CF Builder 这样的编辑器,BOM 标记会处理这个问题,并且不需要处理指令。

【讨论】:

  • @MikCaron 从什么发送? CFHTTP?我不确定为什么要对它们进行编码,可能是您的监控工具在进行转换吗?
  • 所以我下载了 CF 10 Developer 版本并创建了一个小型测试 CFM,它从请求变量中读取。我把那条线固定在顶部,瞧,它工作得很好。谢谢。
【解决方案2】:

您可以尝试使用 setEncoding 函数让 ColdFusion “更加努力地思考”它们是 utf-8。

<cfscript>
    SetEncoding("url", "utf-8");
    SetEncoding("form", "utf-8");
</cfscript>

除非您正在做一些特别专业的事情,否则这两行应该始终在您的 Application.cfm/c 中。

标签cfprocessingdirective 仅在.cfm 文件本身包含utf-8 字符时才有用。来自 url/form/cookie/database 等的 UTF-8 编码字符串不属于该类别,因此不会受到该标签的影响。

【讨论】:

  • "当输入到表单的字符编码或者URL的字符编码不是UTF-8编码的not时使用这个函数"嗯... @987654322 @
  • @Henry 你在说什么?根据您上面的评论“可能是您的监控工具正在进行转换”,这意味着它不是 UTF-8 开始的。
【解决方案3】:

此外,每个应用程序/系统都有自己的设置或默认编码 - 这包括您的 Web 服务器、您的数据库服务器、您的浏览器、您的数据库前端、您的编辑器。在排除明显的情况之前,需要检查所有这些事情。

也试试这个看看你得到了什么。

<cfscript>
    ....
    charencode=CharsetEncode(yourstuffgoeshere, "UTF-8");
    WriteOutput("<br />" & charencode);
</cfscript>

我很好奇您的数据是否实际上是二进制数据。如果是这样,这将为您编码。但推荐的方法是检查您的浏览器、服务器等

信仰斯隆

【讨论】:

  • 浏览器甚至没有发挥作用。我正在使用我用 VC++ 和 MFC 构建的命令行客户端来建立 HTTP 连接并发送数据。我已经使用 fiddler 和 wireshark 抓取了原始字节,以确保我发送的是正确编码的 UTF-8 Unicode 文本。
  • 我试过&lt;cfdump var=#CharsetEncode(form.a,'utf-8')# label='dbg'&gt; 无济于事:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多