ResrouceBundle中文问题我的解决方案

原创 2004年10月27日 10:10:00
以前用Struts+Hibernate,没有碰到这个问题。

application_zh.properties用GBK编码写好后,在JSP中

<%
ResourceBundle b = ResourceBundle.getBundle("application", request.getLocale());
%>

<%= b.getString("a.a") %>

如果JSP不指定编码方式,使用默认的ISO-8859-1,则输出没有问题。但是在我的Mozilla下需要自己手动调一下编码,使用GBK。

但是这样有一个坏处,就是如果浏览器每次都要让用户自己手动调一下编码的话,那可就太不像话叻。

可是如果指定JSP的编码为GBK或者其它的话,似乎除了把application_zh.properties文件用native2ascii转码,就没有别的办法叻。用Eclipse自带的保存时转码的编辑器也不行,唉。

前面提到的问题,我现在解决叻,方法就是自己写一个tag,所有jSP中要输出的文字都通过这个tag,而这个tag就是负责把application_zh.properties中的文字以一定的编码方式读取,再转成一定的编码方式输出。

这个tag包括一个java类,一个taglib描述文件。如下:

Message.java

/*
* Project ffcinema
* Filename Message.java
* Last modified on 2004-10-11
* Author by hongliang
*/

package ff.cinema.tag;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ResourceBundle;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

/**
* @author hongliang
*
* 解决JSP读取ResourceBundle中文乱码的tag 方法是以ISO-8859-1编码读取application_zh.properties,
* 然后转为GBK编码后输出
*
* 关于此Tag的taglib文件: WEB-INF/ffTag.tld
*/
public class Message extends TagSupport
{
  /**
   * 此标签的属性key
   */
  String key = "";

  /**
   * 从什么编码读取,默认是ISO-8859-1
   */
  String fromEncoding = "ISO-8859-1";

  /**
   * 转为什么编码,默认为GBK
   */
  String toEncoding = "GBK";

  /**
   * 资源文字,默认为application
   */
  String bundle = "application";

  public void setKey(String k)
  {
    key = k;
  }

  public int doStartTag() throws JspException
  {
    ResourceBundle b = ResourceBundle.getBundle(bundle, pageContext
        .getRequest().getLocale());
    JspWriter out = pageContext.getOut();

    try
    {
      if (key != null && key.length() > 0)
      {
        out.print(new String(b.getString(key).getBytes(fromEncoding),
            toEncoding));
      }
    } catch (UnsupportedEncodingException e)
    {
      //ignore it
    } catch (IOException e)
    {
      throw new JspException(e);
    }

    return SKIP_BODY;
  }

  /**
   * @param bundle
   *      The bundle to set.
   */
  public void setBundle(String bundle)
  {
    this.bundle = bundle;
  }

  /**
   * @param fromEncoding
   *      The fromEncoding to set.
   */
  public void setFromEncoding(String fromEncoding)
  {
    this.fromEncoding = fromEncoding;
  }

  /**
   * @param toEncoding
   *      The toEncoding to set.
   */
  public void setToEncoding(String toEncoding)
  {
    this.toEncoding = toEncoding;
  }
}


ffTag.tld

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE taglib
    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
    "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>ffTag</short-name>
    <uri>http://localhost:8080/ffcinema/ffTag</uri>
    <tag>
        <name>message</name>
        <tag-class>
            ff.cinema.tag.Message
        </tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>key</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>fromEncoding</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>toEncoding</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>bundle</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>


之后,在web.xml后面使用这个taglib:

<taglib>
    <taglib-uri>http://localhost:8080/ffcinema/ffTag</taglib-uri>
    <taglib-location>/WEB-INF/ffTag.tld</taglib-location>
</taglib>

这样,在JSP里就可以这样用叻,比以前的写法更简单叻:

<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="http://localhost:8080/ffcinema/ffTag" prefix="ff" %>

<html>
<head>
</head>

<body>
<ff:message key="admin.index.title"/>

<a href="index.jsp">
<ff:message key="admin.index.leftmenu" />
</a>

</body>

</html>

myeclipse修改文件编码问题---乱码解决方法

应该是中文操作系统的原因,eclipse默认的新项目的编码是GBK,出于对编码支持的考虑,项目组中最好统一要求是UTF-8编码进行开发。     修改eclipse的配置,可以使得eclipse...
  • shanzhizi
  • shanzhizi
  • 2013年05月31日 22:12
  • 1486

sqlalchemy中文问题解决方案

sqlalchemy是python下一个很强大的ORM,最近刚刚开始使用。当然由于只是刚刚接触,只学习使用了他的DB API,对于Mapper还有些不得要领。   最近写的一个程序,用到MySql数...
  • abcd1f2
  • abcd1f2
  • 2016年04月15日 10:24
  • 201

sqlalchemy中文问题解决方案

sqlalchemy是python下一个很强大的ORM,最近刚刚开始使用。当然由于只是刚刚接触,只学习使用了他的DB API,对于Mapper还有些不得要领。   最近写的一个程序,用到MySql数据...
  • sinat_30603081
  • sinat_30603081
  • 2017年04月05日 14:25
  • 112

中文乱码问题的解决方案

以POST方式提交包含中文字符的表单 在程序里将请求的字符编码方式修改为GBK,如果请求处理完以后,返回给浏览器的内容也包括中文的话,还需要设置内容的编码方式也是GBK。 对于Servlet来说,需...
  • Pan_cras
  • Pan_cras
  • 2016年08月10日 15:07
  • 153

JSP中文问题解决方案

中文问题-技术篇JSP中文问题解决方案 只需要保持下面几处地方设置统一,你的JSP就不会有中文问题 1、JSP的charset, 2、你的JSP SERVER编译JSP是使用的字符集,默认和操作系统是...
  • Bactryki28
  • Bactryki28
  • 2016年06月14日 12:00
  • 1834

中文乱码问题解决方案

中文乱码问题解决方案
  • adam_zs
  • adam_zs
  • 2014年05月19日 19:57
  • 812

中文乱码问题的解决方案

1.以POST方法提交的表单数据中有中文字符     由于Web容器默认的编码方式是ISO-8859-1,在Servlet/JSP程序中,通过请求对象的getParameter()方法得到的字符串是...
  • D_dragon_bamboo
  • D_dragon_bamboo
  • 2016年07月15日 19:04
  • 149

sqlalchemy中文问题解决方案

sqlalchemy是python下一个很强大的ORM,最近刚刚开始使用。当然由于只是刚刚接触,只学习使用了他的DB API,对于Mapper还有些不得要领。   最近写的一个程序,用到MySql数...
  • seanb
  • seanb
  • 2016年05月13日 08:56
  • 1102

net-snmp开发代理常见问题解决方案

转自:http://www.aichengxu.com/view/43967 net-snmp开发代理常见问题解决方案,有需要的朋友可以参考下。 snmpd启动方式: ./s...
  • hubi0952
  • hubi0952
  • 2015年07月02日 10:23
  • 712

web开发中文乱码问题及解决方案

在web应用开发过程中,经常会碰到中文乱码的问题,下面是常见的导致中文乱码的问题以及解决方案(tomcat) 1.JSP页面中包含中文不能保存,eclipse中提示需保存为UTF-8 解决的办法是在j...
  • sunmun
  • sunmun
  • 2016年07月14日 13:09
  • 1246
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ResrouceBundle中文问题我的解决方案
举报原因:
原因补充:

(最多只允许输入30个字)