ofbiz总结——Lookup使用的字段包含中文是显示乱码。

来源:互联网 发布:mac安装不了flash 编辑:程序博客网 时间:2024/06/07 07:37

问题:

在使用Lookup时字段包含中文显示乱码。demo如下图:



选择后输入框中显示:  2016-2017学年



解决方案:

修改文件framework\common\template\includes\AjaxAutocompleteOptions.ftl

原文件:

<#if description??>  <#if autocompleteOptions??>    <#list autocompleteOptions as autocompleteOption>      <#assign displayString = ""/>      <#list displayFieldsSet as key>        <#assign field = autocompleteOption.get(key)!>        <#if field?has_content>          <#if (key != context.returnField)>            <#assign displayString = displayString + field + " ">          </#if>        </#if>      </#list>      <#if (displayString?trim?has_content )>${displayString?trim}</#if>    </#list>  </#if><#else><script type="text/javascript">    var autocomp = [        <#if autocompleteOptions?has_content>          <#if !displayReturnField??>            <#assign displayReturnField = Static[                "org.apache.ofbiz.entity.util.EntityUtilProperties"].getPropertyValue(                "widget", "widget.autocompleter.displayReturnField", delegator)>          </#if>          <#list autocompleteOptions as autocompleteOption>              {                <#assign displayString = ""/>                <#assign returnField = ""/>                <#list displayFieldsSet as key>                  <#assign field = autocompleteOption.get(key)!>                  <#if field?has_content>                    <#if (key == context.returnField)>                      <#assign returnField = field/>                    <#else>                      <#assign displayString = displayString + StringUtil.wrapString(field?string) + " ">                    </#if>                  </#if>                </#list>                <#if ("Y" == displayReturnField)>                  <#assign displayString = displayString +  "[" + returnField + "]">                </#if>                  "id": "${returnField}",                  "label": "<#if (displayString?trim?has_content )>${displayString?trim}<#else>${returnField}</#if>",                  "value": "${returnField}"              }<#if autocompleteOption_has_next>,</#if>          </#list>        <#else>            {                "id": "",                "label": "${uiLabelMap.CommonNoRecordFound}",                "value": ""            }        </#if>];</script></#if>


修改后文件:

<script type="text/javascript">//字符串转字符实体function stringToEntity(str,radix){  var arr=[]  //返回的字符实体默认10进制,也可以选择16进制  radix=radix||0  for(var i=0;i<str.length;i++){                                   arr.push((!radix?'&#'+str.charCodeAt(i):'&#x'+str.charCodeAt(i).toString(16))+';')  }  var tmp=arr.join('')  return tmp}//字符实体转字符串function entityToString(entity){  var entities=entity.split(';')  entities.pop()  var tmp=''  for(var i=0;i<entities.length;i++){    var num=entities[i].trim().slice(2)    if(num[0]==='x')//10进制还是16进制      num=parseInt(num.slice(1),16);    else num=parseInt(num);    tmp+=String.fromCharCode(num)  }  return tmp}//----------------------------------------------------GBK变换为UTF-8--------------------------------------------------------function Str2Unicode(str){var arr = new Array();for(var i=0;i<str.length;i++){arr[i] = "&#" + str.charCodeAt(i) + ";";}return (arr.toString().replace(/,/g,""));}//----------------------------------------------------UTF-8变换为GBK--------------------------------------------------------var unicodeReg=/&#[\da-fA-Fx]{1,6};/ig;/***********************************************Changetheunicodetostring*@paramstr*@returns*/function Unicode2oStr(str){var arr=str.match(unicodeReg);if(arr==null) return(str);var index=str.indexOf(arr[0]);var LastIndex=str.lastIndexOf(arr[arr.length-1]);LastIndex=LastIndex+arr[arr.length-1].length;for(var i=0;i<arr.length;i++){//arr[i]=String.fromCharCode(arr[i].replace(/[&#;]/g,""));arr[i]=entityToString(arr[i]);}var changedStr=str.substring(0,index)+(arr.toString().replace(/,/g,""));if(LastIndex!=-1){changedStr=changedStr+str.substring(LastIndex);}return changedStr;}</script><#if description??>  <#if autocompleteOptions??>    <#list autocompleteOptions as autocompleteOption>      <#assign displayString = ""/>      <#list displayFieldsSet as key>        <#assign field = autocompleteOption.get(key)!>        <#if field?has_content>          <#if (key != context.returnField)>            <#assign displayString = displayString + field + " ">          </#if>        </#if>      </#list>      <#if (displayString?trim?has_content )>${displayString?trim}</#if>    </#list>  </#if><#else><script type="text/javascript">    var autocomp = [        <#if autocompleteOptions?has_content>          <#if !displayReturnField??>            <#assign displayReturnField = Static[                "org.apache.ofbiz.entity.util.EntityUtilProperties"].getPropertyValue(                "widget", "widget.autocompleter.displayReturnField", delegator)>          </#if>          <#list autocompleteOptions as autocompleteOption>              {                <#assign displayString = ""/>                <#assign returnField = ""/>                <#list displayFieldsSet as key>                  <#assign field = autocompleteOption.get(key)!>                  <#if field?has_content>                    <#if (key == context.returnField)>                      <#assign returnField = field/>                    <#else>                      <#assign displayString = displayString + StringUtil.wrapString(field?string) + " ">                    </#if>                  </#if>                </#list>                <#if ("Y" == displayReturnField)>                  <#assign displayString = displayString +  "[" + returnField + "]">                </#if>                  "id": "${returnField}",                  "label": "<#if (displayString?trim?has_content )>${displayString?trim}<#else>${returnField}</#if>",                  "value":Unicode2oStr("${returnField}")              }<#if autocompleteOption_has_next>,</#if>          </#list>        <#else>            {                "id": "",                "label": "${uiLabelMap.CommonNoRecordFound}",                "value": ""            }        </#if>];</script>

主要是替换了value的值,由"${returnField}"替换成了Unicode2oStr("${returnField}")。

会使用到前面新增定义的Unicode2oStr函数和entityToString函数。


原理:

以&#开头的是什么编码?
该编码是html实体,html是以&#开头,并且以;(分号)结尾。中间可以是10进制或16进制的数值。16进制数值的话前面必须以x字符开头。

在网上找到一篇解决lookup中文显示乱码的方案,但是测试后发现不行,所以自己研究后改为上面的最终解决方案。

网上方案失败的原因就是因为那个方案是针对html实体中间是10进制的情况,没有考虑16进制。

所以我对其进行了优化,新增了entityToString和修改unicodeReg正则表达式的定义。