【问题标题】:ColdFusion XML special/foreign character lossColdFusion XML 特殊/外来字符丢失
【发布时间】:2014-07-29 08:49:25
【问题描述】:

我正在尝试将this XML 文件中的联赛列表导入到表格中。

我能够找到我需要的元素,但如果联赛名称中有特殊/外来字符,则无法正确显示。

例如,在 XML 文件中有以下节点:

<trans-unit resname="global.leagueFull.2014.league1005">
    <source>Colombia Finalización</source>
</trans-unit>

但是当我运行我的代码时,这个联赛的输出是哥伦比亚 Finalización。

我的代码如下:

<cfscript>
    xmlContent  = xmlParse("http://www.easports.com/iframe/fut/bundles/futweb/web/flash/xml/localization/messages.en_GB.xml");
    subSet  = xmlSearch(xmlContent,'/xliff/file/body/trans-unit/');
</cfscript>

<cfloop from="1" to="#ArrayLen(subset)#" index="i"> 

    <cfset resName = subSet[i].xmlAttributes.resName />

    <cfif Find("global.leagueFull.2014.league",resName)>
    
        <cfset leagueName = subSet[i].xmlChildren[1].xmlText />
        <cfset leagueID = ListLast(resName,".") />
        <cfset leagueID = Mid(leagueID,7,15) />
    
        <cfoutput>#leagueName#<br /></cfoutput>
    
    </cfif> 

</cfloop>

有谁知道可能导致这些字符丢失的原因,以及是否有办法防止或确实补救?

谢谢

【问题讨论】:

  • 可能是浏览器。你看过你的 ColdFusion 代码生成的 html 吗?
  • 在 Chrome、IE 和 Firefox 中尝试过——结果都一样。是的,查看了源代码,怎么样?

标签: xml coldfusion xml-parsing special-characters


【解决方案1】:

如果您看到类似 Finalización 的内容,这始终意味着 UTF-8 源已被解释为旧式(即每个字符一个字节)编码。

恭喜,您刚刚在 ColdFusion 中发现了一个错误。 (根据 Adam Cameron 在 cmets 中的提示,这是 Bug #3183072,自 CF 11 起已修复。)

试试这个变通方法:

<cfhttp url="http://www.easports.com/iframe/fut/bundles/futweb/web/flash/xml/localization/messages.en_GB.xml">

<cfif ListFirst(cfhttp.statusCode, " ") eq "200">
  <cfset xmlContent = XmlParse(cfhttp.FileContent)>
  <cfset xPath = "/xliff/file/body/trans-unit[starts-with(@resname, 'global.leagueFull.2014.league')]">
  <cfset subSet = XmlSearch(xmlContent, xPath)>

  <cfloop array="#subSet#" index="transUnit">
    <cfset leagueName = transUnit.source>
    <cfset leagueID = Mid(ListLast(transUnit.XmlAttributes.resName, "."), 7, 15)>
    <cfoutput>#HTMLEditFormat(leagueName)#<br></cfoutput>
  </cfloop>
<cfelse>
  Error fetching file. (<cfoutput>#cfhttp.StatusCode#</cfoutput>)
</cfif>

请注意,我使用 XPath 的 starts-with() 替换了您的 &lt;cfif&gt;。这样更高效、更简洁。

【讨论】:

  • 太棒了!这解决了问题,而且开始时肯定更干净,很棒的提示!非常感谢您的帮助:)
  • 不客气。我已经切换到&lt;cfloop array="..."&gt;,这也是向前迈出的一步。请参阅修改后的答案。 (另请注意HTMLEditFormat() - 作为安全预防措施,您不应该在未先将其转义为 HTML 的情况下将任何数据输出到 HTML。)
  • @Tomalak:“恭喜,您刚刚在 ColdFusion 中发现了一个错误”:就是这个错误:bugbase.adobe.com/index.cfm?event=bug&id=3183072。它已在 CF11 中修复。
猜你喜欢
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
相关资源
最近更新 更多