[Seasar-user:16312] [Dolteng] Teedaのページクラス作成時の文字コード

あきら [E-MAIL ADDRESS DELETED]
2008年 11月 18日 (火) 17:02:35 JST


あきらです

DoltengのTeeda用ページクラス作成ウイザードなのですが
xml宣言がない場合にはシステムの文字コードで処理されております。
これをeclipseで設定されている文字コードで処理するようにはでき
ないでしょうか?

==================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns:te="http://www.seasar.org/teeda/extension">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form id="form">
  <div>
    <span id="str">Test</span>
    <input type="button" value="編集" />
  </div>
</form>
</body>
</html>
==================================================

上記の場合には先頭にXML宣言があるので正しくutf-8で処理されます。
先頭のXML宣言をはずすとWindows上の場合SJISとしてパースされて
しまいますので、"編集" の部分が "邱ィ髮・ として処理され、正常に
閉じられていないのでページクラスのプロパティーが取得できません。

" 編集 " など前後にスペースをいれるや、XML宣言をすれば正しく動く
のですが、xhtmlのXML宣言はIE6で互換モード扱いになったりして、
デザイン系のサイトの場合には使いにくい状況です。

Doltengのソースをみたところ、以下のライブラリの中で処理を
しておりました。ここは外部ライブラリなのでされません。

===========================================
jp.aonir.fuzzyxml.FuzzyXMLParser.java
===========================================
  /**
   * 入力ストリームからXMLドキュメントをパースします。
   * 文字コードはXML宣言にしたがって判別されます。
   *
   * @param in 入力ストリーム
   * @return パース結果
   * @throws IOException
   */
  public FuzzyXMLDocument parse(InputStream in) throws IOException {
    byte[] bytes = FuzzyXMLUtil.readStream(in);
    String encode = FuzzyXMLUtil.getEncoding(bytes);
    if (encode == null) {
      return parse(new String(bytes));
    }
    return parse(new String(bytes, encode));
  }

===========================================

そこでDolteng側の読み込み部分でEclipseの文字コードを
セットして処理にしてもらうことはできませんでしょうか?

===========================================
org.seasar.dolteng.eclipse.plugin\src\main\java\org\seasar\dolteng\eclipse\util
FuzzyXMLUtil.java
===========================================
    public static FuzzyXMLDocument parse(IFile file) throws IOException,
            CoreException {
        FuzzyXMLParser parser = new FuzzyXMLParser();
        FuzzyXMLDocument doc = parser.parse(new BufferedInputStream(file
                .getContents(true)));
        return doc;
    }

これがデフォルトのソースですが、下が変更案です

    public static FuzzyXMLDocument parse(IFile file) throws IOException,
            CoreException {
        FuzzyXMLParser parser = new FuzzyXMLParser();

        byte[] bytes = readStream(new BufferedInputStream(file
                .getContents(true)));
        String encode = getEncoding(bytes);
        if (encode == null) {
            encode = file.getCharset();
        }
        FuzzyXMLDocument doc = parser.parse(new String(bytes, encode));
        return doc;
    }

===========================================

すみません、コンパイルしていません。。。
IFileをInputStreamを渡した場合、FuzzyXMLUtilの関数でString
に変換してからパースしなおしているので、StringまでDolteng
側で処理をした後に渡せればXML宣言ない場合でも動いてくれる
のかなと期待しています。

あきら


Seasar-user メーリングリストの案内