数値文字参照への変換(指定した文字コードで使えない文字のみ)(Java版)

エンコーディングを指定してください。

目的

エンコード(文字コード)を指定してください。 このエンコードで使えない文字を数値文字参照 (「가」の形でユニコード番号を10進数であらわした物) に変換します。

使い方

まず、エンコードを指定してください。 方法は2つあります。

  1. リストから選んでください。
  2. リストで「右の入力欄に直接入力⇒」を選んだ場合は、 エンコーディング名を直接入力してください。

左のテキストエリアに文字列を書き込んで 「O.K.」ボタンを押してください。
すると、右のテキストエリアに変換結果が表示されます。
これをマウスの右クリックなどでコピーして、目的の位置に貼り付けてください。

エンコーディング名は、たとえば、 http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html を参考にしてください。 (Javaランタイムのバージョンによって、または各ベンダ(Javaランタイムの 製造者)によって、使えるエンコーディング名は異なります。)

動作確認

Java1.1では、うまく動かないかもしれません。(原因調査中)

日本語版Windows98(ただし、Java1.4をインストールしている)で テストしてみたところ、 Internet Explorer 6 、Netscape 7、及びOpera 7 でうまく動きました。
Netscape4.5では動きませんでした。

問題点

Javaアプレットを使っているためか、 ページを開いた時に、Tabキーで項目を移動できません。 (ただし、一旦別のウインドウに移ってから、もう一度 このページに戻ると、IE6とNetscape7では Tabキーで項目を移動できました。 Opera7ではどうしてもマウスを使わないとフォームなどを アクティブにできませんでした。)
マウスを使っている分には、別に困りはしないのですが....。

ひょっとしたら、ブラウザが使用しているJavaのバージョンによっては 動かないのかもしれません。 実際、Netscape4.5(Java Consoleでは「Java 1.1.5」と表示される)では
# Applet exception: error: java.lang.ClassFormatError: Bad major version number
とエラー表示されます。 (アプレットのコンパイルに使ったのはJava 1.4です。)

2003年11月30日(日)追記:
javac -target 1.1 UnicodeToCharEntities.java
でコンパイルし直してみました。 でも、Netscape4.5でうまく動かなかったです。 エラー表示はなかったのですが、ボタンを押しても 変換されず、ブラウザが固まったような、変な感じになりました。

どこがJavaなのか?

javaアプレット内で定義した convertToCharEntitiesUnlessEncodable という関数を JavaScriptから呼び出しています。

javaアプレットのソースコードは UnicodeToCharEntities.java です。 内容は、次の通りです:

import java.awt.*;
import java.io.*;
public class UnicodeToCharEntities extends java.applet.Applet {

    int getUnicodeNumber(char ch) {
        return (int)ch;
    }

    boolean isEncodable(char ch, String enc) {
        String originalString = new Character(ch).toString();
        byte[] encodedByteArray = null;
        String decodedString = null;
        try{
            encodedByteArray = originalString.getBytes(enc);
	}catch(UnsupportedEncodingException e){
	    return false;
        }catch(Exception e){
        }
        try{
            decodedString = new String(encodedByteArray, enc);
        }catch(Exception e){
        }
        return decodedString.equals(originalString);
    }
    
    public String convertToCharEntitiesUnlessEncodable(String orig, String enc) {
        StringBuffer outputString = new StringBuffer("");
        for(int i = 0; i < orig.length(); ++i){
            if(this.isEncodable(orig.charAt(i), enc)) {
                outputString.append(orig.charAt(i));
            } else {
                outputString.append("&#" + this.getUnicodeNumber(orig.charAt(i)) +";");
            }
        }
        return outputString.toString();
    }
}    

2003年11月28日(金)作成
2003年12月27日(土)修正