JavaのStringクラスと外字について
- JavaのStringクラスには「外字」という概念は存在するのか疑問に思っています。Shift-JISの文字列データには外字が含まれているのですが、Unicodeへの変換とShift-JISへの戻しにおいて外字はどのように処理されるのでしょうか。
- JavaでShift-JISの文字列データを扱う際、文字列はUnicodeに変換されますが、外字の部分はどのように処理されるのか気になっています。また、UnicodeからShift-JISに戻す際にも外字は正しく復元されるのか不安です。
- JavaでShift-JISの文字列データに外字が含まれている場合、そのUnicodeへの変換とShift-JISへの復元はちゃんと行われるのか心配です。Stringクラスのリファレンスで「外字」について検索したが見つからず、不安になっています。
- ベストアンサー
JavaのStringクラスに「外字」という概念はある?
今、客先のデータをJavaで処理しようとしているのですが、そのデータ(Shift-JISの文字列データ)には、今まで使われてきた「外字」が含まれています。 私の知っている範囲では、Shift-JISの文字列でも、Javaで読み込んだら内部的にUnicodeに変換されるのではないかと思っているのですが(←間違っているかもしれません)、そのUnicode変換の際に外字の部分はどうなってしまうのでしょうか。また、Unicodeに変換された文字列を、出力の際にまたShift-JISに戻すことになると思うのですが、そのときにはちゃんと以前の外字コードに戻ってくれることが保証されているのでしょうか。 JavaのリファレンスでStringクラスのページで「外字」という文字列で検索してみたのですが、まったくひっかからなかったので不安になっています。 よろしくお願い致します。
- annyGrace
- お礼率53% (45/84)
- Java
- 回答数2
- ありがとう数4
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 似たような質問があがっているところを見つけました。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=12&topic=22555 ということで、これを参考に実験です。 UTF-16の外字の領域を一文字ずつShift-JISに変換して、また、UTF-16に戻して、ちゃんともとにもどるか、やってみました。 public class Gaiji { public static void main(String[] args) throws Exception { final String charSet = "Shift-JIS"; boolean allEqual = true; for (char c = 0xE000; c <= 0xF8FF; c++) { System.out.print(Integer.toHexString((int)c) + "→"); char[] carray = {c}; String source = new String(carray); byte[] sjis = source.getBytes(charSet); for (byte b : sjis) System.out.print(Integer.toHexString(((int)b & 0xFF))); System.out.print("→"); String result = new String(sjis, charSet); System.out.print(Integer.toHexString((int)result.charAt(0)) + " : "); boolean equal = source.equals(result); System.out.println(equal); allEqual = (allEqual && equal); } System.out.println(); System.out.println("すべて一致 : " + Boolean.toString(allEqual)); } } (コンパイルするときは全角スペースを半角スペースに変換してからにしてください) ところがぜんぜんダメ。 元に戻りません。 ということで、Windowsの本来の文字コードWindows-31Jでやってみました。 final String charSet = "Windows-31J"; ←変更 どうやらうまく行っているのですが、途中までは順調に変換され、元に戻るものの、途中からだめになりました。 どうやら、UTF-16 : E757 Shift-JIS : F9FC の次からだめになっています。 外字エディタで見てみるとちょうどF9FCまでが、Shift-JISの外字領域のようです。 つまり、UTF-16のほうがShift-JISより、外字領域が大きいみたいです。 当然そこから先は、Shift-JISには、変換不能ということになります。 というわけで、 1.Windowsでは、通常ならCharSetがShift-JISでも大体大丈夫だけど、外字の変換をするときにはちゃんとWindows-31Jを指定しないとダメ。 2.UTF-16 : E000~E757 Shift-JIS : F040~F9FC の範囲なら変換可能。 UTF-16 : E758~F8FF の範囲はShift-JISに相手がいないので無理。 ってことで、Shift-JISで外字が設定されているのなら、大丈夫ってことになるんじゃないでしょうか。
その他の回答 (1)
- PecoPlus
- ベストアンサー率76% (144/188)
こんばんは、興味があったので実験してみました。 (環境 WindowsXP SP2 : JDK 1.5.0_04) 外字エディタにて シフトJISで F040 Unicodeで E000 に外字を作成。(手書きのふにゃふにゃ温泉マーク) char[] c = {0xE000}; String s = new String(c); System.out.println(s); これで、ちゃんと外字が出てきました。 次に、メモ帳にて外字の温泉マークが書いてあるテキストをシフトJISで保存。 BufferedReader br = new BufferedReader(new FileReader("gaiji.txt")); for (String line; (line = br.readLine()) != null;) { System.out.println(line); } やっぱり、普通に温泉マークが出てきました。 今度は、外字エディタで作った温泉マークを削除。 さっきのコードを実行すると、温泉マークが出てこず、空白になります。 早い話が、char型変数やStringクラスが扱っているのは文字コードという純然たる数字であって、実際にフォントとして描くのはシステムに依存しているって事なんじゃないでしょうか。 つまり、結局のところ、OSでその文字コードに外字が割り当ててあれば、ちゃんと表示され、されていなければ、それなりになるって事だと思います。
補足
ありがとうございます。 これは ・Shift-JISでは外字領域はF040以降(←これは知ってました) ・UnicodeではE000以降 ・それらは1対1で対応している ・たとえばF040<->E000、F041<->E001、というように ・これをやってくれるのは、Javaの仕様 っていうことなんでしょうか。 Unicodeに直した後は、画面には表示する予定はないので、フォントの割り当てなどは気にならないのですが、Shift-JIS変換の際に相互の可逆性があるかどうかが気になっているのです。 ご存じでしたら教えてください。お願いします。<(_ _)>
関連するQ&A
- unicodeにしかない漢字をSJISの外字に簡単登録
Windows OS上には、Shift-JISにないunicode文字が たくさんありますが、shift-JISで漢字を処理している プログラムでは、プログラムをunicode対応に変更する 方法もありますが、変更をしないとすれば、Shift-JIS上の 外字を作成し、コードを対応付けして変換するようにするしかありません。(あまり頻度は多くはないので) ただ外字エディタで外字を作るのはかなり面倒な作業です。 unicode上の漢字イメージ情報を元にShift-JISの外字へ登録するようなツールはないでしょうか? あれば、外字対応が非常に楽になるのです。 ご存じの方があれば教えて下さい。
- 締切済み
- Windows系OS
- javaの文字コード変換について
javaの文字コード変換についての質問ですが 1 shift_jis → jis83 → jis78 2 jis78 → jis83 → shift_jis と変換をかけたいと思っていますがどのようにすれ ばいいのでしょうか? String str = new String( "hogehoge", "XXX" ); でコンストラクタの2つめの引数に変換をかけたい 文字コードの指定をすればうまくいくのでしょうか? もしそうならなんと指定すればいいのでしょうか? 以上よろしくお願いします
- ベストアンサー
- Java
- Javaストリング文字列 の文字コード変換
JavaでHttpRequestをつかい、 xmlを文字列で取得しDocumentオブジェクトに格納する際に、 文字コードの変換は必要でしょうか。 元のxmlはShift-Jisです。 UTF-8に変換する必要があるとどこかで見たため質問させていただきました。 また、変換が必要な場合の実装方法も教えてください。 よろしくお願いします。
- 締切済み
- Java
- 外字の除去方法
WindowsXP(SP2) VisualBasic6.0(SP6) を使って開発をしています。 現在、文字列から外字を除去するプログラムを作っています。 S-JIS(F040~F9FC)にあたる外字を除去する方法は分かったのですが、Unicode(E000~F8FF)にあたる外字を除去する方法が分からず困っています。 ご存知の方がいましたら教えてください。 宜しくお願いします。 (追伸) ↓↓S-JIS外字を除去する場合------------------------------------- Public Function DeleteGaiji(strText As String) As String Dim Reg As New RegExp Reg.Pattern = "[" & Chr(&HF040) & "-" & Chr(&HF9FC) & "]" Reg.Global = True DeleteGaiji = Reg.Replace(strText, "") End Function 上記の方法でS-JIS外字を除去しようと思っています。 Unicodeの場合は、 Reg.Pattern = "[" & Chr(&HE000) & "-" & Chr(&HF8FF) & "]" とすれば良いのでしょうか? 別の表現方法があるのかなと思って、悩んでいます。
- 締切済み
- Visual Basic
- WindowsのUNICODEをJavaのStringに変換したい
Windowsからソケット通信でUNICODE(little endian)文字列を受け取っています。 bufferはバイト配列で格納されているとして String text= new String(buffer);とか String text= = new String(buffer,"MS932");とか String text= new String(buffer,0,長さ,"UNICODE"); などとするのですが漢字コードが化けてしまいます。 エンディアン並びを逆にしたりしましたがやはり同じです。 半角の場合、例えば「abc」なら「 a b c」と 0x0の部分がスペースになっていました。 ところでWindowsがメモ帳などではき出すunicodeはjavaのunicodeとは違う と聞きましたがどうなんでしょうか? 宜しくお願いします。 ※バイト配列をそのまま返すとそれをWindowsクライアントは表示するので 通信部分でバイト配列が壊れている事は考えにくいです。
- ベストアンサー
- Java
- javaで文字変換したいんです。
たとえば "82 A0 82 A2 82 A4 41 42 43 82 A6 82 A8 " という文字列を "あいうABCえお"に変換したい場合どのようにすればいいのでしょう? 変換前の文字コードはS-JISとします。 変換前の文字列はStringに入っているものとします。 String str="82 A0 82 A2 82 A4 41 42 43 82 A6 82 A8 "; //こんな感じ java は初めてで困ってます。 Cなら何とかなるんですが・・・ どうかお知恵をお授けください。
- ベストアンサー
- Java
- Stringの文字列をString[]配列に変換したい
お世話になります♪ たとえばこういうStringの文字列があるとします。 String s = "私は Javaを 勉強 しています。"; これを下記のようなイメージでString[]配列に変換したいのですが、 {"私は","Javaを","勉強","しています。"}; 何かいい方法はないでしょうか? ヒントをください! よろしくお願いします。
- ベストアンサー
- Java
- JAVAでSJISのコード変換
JAVAで、UnicodeからSJISへのコード変換を行った上で ファイル出力を行いたいです。 たとえば文字列中にある「(1)」の文字コードが以下である時 ------------------------------- SJIS:8744 - UNICODE:2464 ------------------------------- 2464のコードを8744に変換した上でファイル出力したいです。 処理として、以下の様な形を考えているのですが 文字化けしてしまします。 ------------------------------- String source = "(1)あああああ"; 文字列の数分ループ処理↓ int code = (int) (source[x].charAt(i)); if (code == 2464) { strBuff.append(String.valueOf((char) (8744))); } ------------------------------- Unicodeで扱われているので「getByte("SJIS")」などとしているのですが 同様の結果となります。 何か良い手はないものでしょうか?
- ベストアンサー
- Java
- UNIXの文字について
UNIX⇔WINDOWSでのデータのやりとりを実施したいのですが、 1、UINX(UNICODE)とWIN系(JIS)の文字コードの対応はどうすればよいのでしょうか? 2、UINX(UNICODE)とWIN系(JIS)の文字の変換はどうすればよいのでしょうか? 3、外字の対応はどうせうればよいのでしょうか?
- 締切済み
- Solaris系OS
- 内部文字コードとは?
javaは内部では文字をユニコードとして扱うとは、 どういう事でしょうか? 例えば、javaのブログラムをwindows上で作ったとして、 「こんにちわ」と出力させるプログラムを作ったとすると、 public class Hello{ public static void main(String[] args) { System.out.println("こんにちわ"); } } となりますよね、この時、このjavaのソースファイルを、 ユニコードとして保存して、コンパイル、実行しないと、 正常に動かないという事でしょうか? つまり、ソースをシフトJISで保存してJAVAでコンパイルをしようとすると、ソースコード中の文字をユニコードとして扱うため、 文字化けして、コンパイラは一体何の事か分からずエラーみたいな感じになるのでしょうか?(それとも自動で文字コードをユニコードに変換してくれるのかな?) 要するに、「内部文字コード」という言葉が何を指しているのかが分からないですが、よろしくお願いします。
- ベストアンサー
- その他([技術者向] コンピューター)
お礼
ありがとうございます! 概念としても理解できましたし、扱うためのコーディング例までわかりました。本当にありがとうございました。