JAVA2でUnicode→SJISで元に戻るようにするには?

[上に] [前に] [次に]
aj 2000/01/28(金) 15:55:23
ブラウザ上で入力される文字を制御したいと思い、
if(val.charAt(i) > \"я\" && val.charAt(i) < \"亜\"){
とゆう条件文をかいてるのですが"я"よりもコードの小さい"あ"など
の文字も条件文の中に入ってしまいます。
わかる方がいましたら教えてください!

EMI 2000/01/28(金) 19:53:59
ロケールの問題でしょうか。
文字コードそのものを比較すれば、うまくいくかもしれません。

ところで、タイトルと質問の内容が全く合ってないんですけど。

三原克大 [E-Mail] 2000/01/30(日) 00:59:33
aj さんが上の条件文をどういう文脈で使おうとしているのか
よく分からないのですが、
Java 言語の場合は独自の事情があります。

  java.lang.String クラスは Unicode しか扱えない
    ロケールを指定してもこの点は変わりません。
    別のコードを使うとしたら、別のクラスの実装が必要です。
  char は 16bit である
    Unicode の文字を素直に扱うための必然です。

アプリケーションプログラマが勝手に他の文字コード
(例えば SJIS)のバイナリを格納することはできません。
そうしたら length() さえ動きません。
あらかじめ Unicode に変換しておく必要があります。

おそらく aj さんも分かっていらっしゃることを書くと、
Unicode は世界にある既存の文字コードの多数を取り込み
独自のコードポイントにおいているので、
キリル文字のラストと漢字の最初の間が
規格上の空き地ではありません、別の文字があります。
手元に資料がないのですが、 Unicode では
日本語にひらがなとカタカナはキリル文字の後に定義されたのです。
さらには、漢字は日中韓の漢字を重ね合わせて並べ替えたので
「亜」が最初ではないのです。# 確かそのはず。

これはもう Unicode の資料を取り寄せるしかないでしょう。
Unicode コンソーシアムの洋書、 http://www.unicode.org/
JIS X221 (ISO 規格の日本語訳と訳者注)に
直接あたった方がよいと考えます。

または、 *Writer と *Reader クラスで
例外を受け取る手もあります。
これらのクラスではストリームのラッパーとして
コード変換を担当していて、
コンストラクタで与えられたコードの範囲外の文字を受け取ると
例外を投げるようにできています。
入出力時にチェックするやり方ですね。

三原克大 [E-Mail] 2000/01/30(日) 01:38:04
調子に乗りすぎました。
調べてみたら手は、それなりに、ありました。それなりに。

java.lang.String クラスのメソッド
  byte[] getBytes(String enc)
    enc は文字コードの名前です。
    Since JDK1.1
java.lang.String のインスタンスのこのメソッドを呼ぶと、
指定された文字コードに変換して byte の配列に格納します。
後は自分で論理をコーディングすれば
SJIS のコード順に並べることもできる、はず、です。
文字コードの名前は JDK のドキュメントを参照してください。
Pure Java なら JDK がサポートする文字コードは
どのプラットホームであろうともサポートしていますから
SJIS か EUC-Japan かで悩むことはないはずです。

ただし、このときはソースコード内にめあての文字を
直接書き込むことはできなくて
# もし書いたら、コンパイラに渡される前に
# 当該文字の Unicode でのコードポイントを示す
# エスケープ表現に変換されてしまいます。
SJIS なりなんなりでのコードポイントを
数字で書く必要があります。

aj 2000/01/30(日) 21:26:14
[[解決]]
なんとか解決できました。
ありがとうございました!

[上に] [前に] [次に]