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正则表达式的定义。
阅读全文
0 0
- ofbiz总结——Lookup使用的字段包含中文是显示乱码。
- Oracle使用——PLSQL的中文乱码显示全是问号
- Oracle使用——PLSQL的中文乱码显示全是问号
- Oracle使用——PLSQL的中文乱码显示全是问号
- Oracle使用——PLSQL的中文乱码显示全是问号解决办法
- OFBiz 的中文乱码解决方案
- OFBiz 的中文乱码解决方案
- OFBiz 的中文乱码解决方案
- OFBiz 的中文乱码解决方案
- ofbiz总结——当有很多条消息时右下角“显示全部”乱码
- ofbiz 中文乱码问题解决
- ofbiz学习——深入分析lookup标签实现原理
- jsp包含html文件中文显示乱码的解决方法
- 乱码的解决方案——cookies中包含中文
- PyCharm----中文显示乱码的解决方法总结
- java文件下载包含中文是乱码
- crm2013的关于lookup字段的值不显示
- Boostrap 显示中文乱码,又是乱码
- 如何将本地项目上传到github
- C语言实验--计算表达式
- 【1701H1】【穆晨】【171023】连续第十三天总结
- mysql处理高并发,防止库存超卖
- Spring MVC框架搭建
- ofbiz总结——Lookup使用的字段包含中文是显示乱码。
- java获取windows Active Directory信息
- 剑指offer
- LeetCode_8_String to Integer (atoi)
- 清除浮动优缺点
- Python(十一)枚举类
- json错误解析net.sf.ezmorph.bean.MorphDynaBean cannot be cast to
- openssl升级后 libssl.so.10缺失及版本问题
- 欢迎使用CSDN-markdown编辑器