Index: [Article Count Order] [Thread]

Date:  Wed, 20 Dec 2000 03:02:46 +0900
From:  Tuyoshi Ushio <t-ushio@....com>
Subject:  [XP-jp:01362] about HttpUnit Encoding
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <3A3FA1EA.44B1FCB3@....com>
Posted:  Wed, 20 Dec 2000 02:59:06 +0900
X-Mail-Count: 01362

牛尾です。

先日から、皆さんから教えていただいたHttpUnitをテストで使っていたので
すが、テーブルのCellの中身のデータを取得するWebResponseのgetTablesと
いうメソッドでどうしても文字化けしてしまうので、HttpUnitのソースを
2クラス位いじるとやっとこさ動くようになりました。

HttpUnitを使ってる他の方々は文字化け問題はどうやって回避したの
でしょうか?やっぱりソース直してるのですか?それとももっと
いい方法があるのでしょうか?

あと、もし同じ問題で悩んでる人がいたら、、ということで、
一応私の修正したポイントなんかメール末につけときます。。
ソースはめちゃダサですが。サーバがShift_JISの例です。

#MLではXPの本のことが盛んにかかれていますね。あ〜早く手にいれてぇ。

・HttpUnitのクラス
-----------ReceivedPage.java
private static Tidy getParser() {
    Tidy tidy = new Tidy();

    // JTidyはUTF-8,ISO2022に対応しているがそれらを指定してもダメ。
    tidy.setCharEncoding(org.w3c.tidy.Configuration.RAW); 
    tidy.setQuiet( true );
    tidy.setShowWarnings( HttpUnitOptions.getParserWarningsEnabled() );
    return tidy;
    }
---------------------------
-----------WebResponse.java
 private String _characterSet = "Shift_JIS"; // 一応変えた。

 private static String getResponseText( URL url, 
                                    URLConnection connection ) {
    StringBuffer sb = new StringBuffer();
    try {
        // getInputStreamがデフォルトエンコーディングだったので明示化
        BufferedReader input = new BufferedReader( 
   new InputStreamReader(connection.getInputStream() ,"Shift_JIS") );
----------------------------

・テストの記述例
----------------------TestAp(sample)
WebResponse  response;
...

String [][] customers = response.getTables()[0].asText();
String customerJP = getShiftJIS(customers);
    assertEquals("XXXX",customersJP[1][1]); // XXXX is Japanese 
    assertEquals("????",customersJP[2][1]); // ???? is Japanese
    assertEquals("****",customersJP[3][1]); // **** is Japanese 

}
...
// 面倒くさいのでString [][]の中身を文字変換するメソッドを作成。
// コーディングはしょぼい。

private String [][] getShiftJIS(String [][] shiftJis){
    int arrayFirst = shiftJis.length;
    int arraySecond = shiftJis[0].length;
    int i,l;
    String [][] retString = new String[arrayFirst][arraySecond];
    for(i = 0 ; i < arrayFirst ; i++){
        for(l = 0 ; l < arraySecond ; l++){
            try{
                retString[i][l] = 
                  new String(shiftJis[i][l].getBytes("8859_1"),
                  "Shift_JIS");
                }catch (Exception e){
                }
        }
     }
return retString;
}
...