0

非ASCII文字を.tagファイルに入れると、それらの文字は正しくエンコードされません。

私のアプリケーションはjetty8.1.4で実行されます。

.tagファイルにが含まれている場合é、結果のHTMLページに。として表示されéます。同じ文字をJSPファイルに入れると、正しく表示されます。パラメータと同じ文字をタグに渡すと、正しく表示されます。

ファイルのエンコーディングはUTF-8です。結果ページもUTF-8でエンコードされます。UbuntuでEclipseからアプリケーションを実行するとき、またはdebianサーバーのjarにタグをデプロイするときに、同じ問題が発生します。

jettyによって生成されたjavaファイルでタグを確認したところ、次のéように変換されました。

out.write('Ã');
out.write('©');

したがって、タグがJavaクラスにプリコンパイルされると、エンコーディングが間違っています。

このステップでエンコーディングを制御できますか、または.tagファイルでエンコーディングを指定できますか?


詳細は次のとおりです。

タグファイルには、次の1文字のみが含まれていますé。16進数で表示した場合と同じようにエンコードされC3 A9ます(正しいUTF-8エンコード)。javaファイルは次のとおりです。

package org.apache.jsp.tag.web.tagLink.layout;

import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*;

public final class test_tag
    extends javax.servlet.jsp.tagext.SimpleTagSupport
    implements org.apache.jasper.runtime.JspSourceDependent {


  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.Vector _jspx_dependants;

  private JspContext jspContext;   private java.io.Writer _jspx_sout;  private org.glassfish.jsp.api.ResourceInjector _jspx_resourceInjector;

  public void setJspContext(JspContext ctx) {
    super.setJspContext(ctx);
    java.util.ArrayList _jspx_nested = null;
    java.util.ArrayList _jspx_at_begin = null;
    java.util.ArrayList _jspx_at_end = null;
    this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, _jspx_nested,
_jspx_at_begin, _jspx_at_end, null);   }

  public JspContext getJspContext() {
    return this.jspContext;   }

  public Object getDependants() {
    return _jspx_dependants;   }

  public void doTag() throws JspException, java.io.IOException {
    PageContext _jspx_page_context = (PageContext)jspContext;
    HttpServletRequest request = (HttpServletRequest) _jspx_page_context.getRequest();
    HttpServletResponse response = (HttpServletResponse) _jspx_page_context.getResponse();
    HttpSession session = _jspx_page_context.getSession();
    ServletContext application = _jspx_page_context.getServletContext();
    ServletConfig config = _jspx_page_context.getServletConfig();
    JspWriter out = jspContext.getOut();

    try {
      out.write('Ã');
      out.write('©');
    } catch( Throwable t ) {
      if( t instanceof SkipPageException )
          throw (SkipPageException) t;
      if( t instanceof java.io.IOException )
          throw (java.io.IOException) t;
      if( t instanceof IllegalStateException )
          throw (IllegalStateException) t;
      if( t instanceof JspException )
          throw (JspException) t;
      throw new JspException(t);
    } finally {
      ((org.apache.jasper.runtime.JspContextWrapper) jspContext).syncEndTagFile();
    }   } }

2つの呼び出しのパラメーターを見るout.writeと、それらはC3 83C2 A9です。残りは単なるASCIIです。

テストタグのみを含むJSPページを作成しました。ブラウザから表示すると、次のように表示されますC3 83 C2 A9。これがFiddler2で撮影された写真です。ブラウザはIE8です。

Jettyサーバーから受信したデータ

é文字をJSPページに直接配置するC3 A9と、Javaで生成されたファイルのように、またブラウザで受信したメッセージのようにエンコードされます。

4

2 に答える 2

1

HTMLを作成する場合は、JSPで直接UTF-8バイトを使用しないでください。

私のお気に入りのUTF-8ユーティリティを簡単にチェックすると、あなたのキャラクターは次のようになります。

http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=C3+A9&mode=bytes

したがって、代わりに次のいずれかを使用してください。

  • é(数値UTF-8シーケンス、ほとんどのブラウザーで最適にサポートされています)
  • é (16進UTF-8シーケンス、ほとんどのブラウザーで機能します)

HTMLの例を次に示します。

<html>
  <body>
    Example (numeric UTF-8): &#233; <br/>
    Example (hex UTF-8); &#x00E9; <br/>
  </body>
</html>
于 2013-02-08T13:03:14.457 に答える
1

正解はJanによって与えられました。

タグファイルに次の行を追加すると、問題が修正されます。

<%@tag pageEncoding="UTF-8"%>
于 2013-08-02T15:53:47.787 に答える