- PR -

Linux上の特殊漢字の扱い

投稿者投稿内容
Goki
会議室デビュー日: 2004/03/02
投稿数: 16
投稿日時: 2004-10-04 13:26
JAVAに対する話題から外れていると思いますが、
みなさんは、以下のケースにどのように対応しているか
教えてもらえないでしょうか?

開発環境は、

クライアントOS:Windowsシリーズ
サーバOS:RedHat9
WEBアプリケーション:JAVA Stutusにて構築
サーバ上DB:PostgreSQL 7.3
WEBサービス:Apache2.0.48及びTomcat4.1.29

クライアントPCから特殊漢字の人名データを
入力してLinuxでは、この特殊漢字を認識できず、
?と登録され、WEBアプリケーション上の表示も
当然ながら?と表示されますが、この特殊漢字をサポート
できるようにしたいですが、これには、どのように対応
なさっているのでしょうか?

何かご存知でしたらよろしくお願いいたします。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-10-04 13:59
単に、エンコードがあってないだけではないでしょうか。
検索エンジンに、「jsp 文字化け」と放り込むだけで、
たくさんの解説サイトがヒットしますよ。

<追記>
Javaの話題からはずれるどころか、Webで日本語を扱う上で、
もっともメジャーな課題のひとつだと思います。
ひとつ、腰を入れて対処してみてください。

[ メッセージ編集済み 編集者: Edosson 編集日時 2004-10-04 14:11 ]
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-10-04 15:18
引用:

Edossonさんの書き込み (2004-10-04 13:59) より:
単に、エンコードがあってないだけではないでしょうか。




いや、思うに機種依存文字とか外字とかの問題のような気が・・・。

# ちなみに、私はJavaで外字をどう扱うかなんて全然分からないです
# String型は内部的にUnicodeになっちゃってるんで、外字のShift_JISコードが
# Unicodeでどう割り当てられるかが分かれば、とっかかりにはなるんでしょうが。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-10-04 15:59
失礼しました。

エンコーディングの違いならともかく、外字となるとやっかいですね。
ちなみに、外字については、下記のものを見つけました。
http://java-house.jp/ml/archive/j-h-b/012581.html
おおざっぱにはしょっていうと、JVMが表示に使っているフォントの、
該当するコードの位置に外字が登録されていれば、使えることもあるとのこと。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-10-04 16:40
引用:

Edossonさんの書き込み (2004-10-04 15:59) より:
おおざっぱにはしょっていうと、JVMが表示に使っているフォントの、
該当するコードの位置に外字が登録されていれば、使えることもあるとのこと。


いや、それはアプレットの話ですよね。
今回の質問でいえば、PostgreSQLの文字コードがEUCだと仮定すると、
・Shift-JIS(Windows-31J) <-> Unicode
・EUC-JP <-> Unicode
での外字マッピングがおこなえるかどうか、という話だと思います。JavaHouseの話題は
結構古い話なので、今のJavaの実装はどうなのかよくわからないですが、あまり期待できない
ですねえ。ところで、

引用:

入力してLinuxでは、この特殊漢字を認識できず、
?と登録され、WEBアプリケーション上の表示も
当然ながら?と表示されますが、この特殊漢字をサポート
できるようにしたいですが、これには、どのように対応
なさっているのでしょうか?


Linuxからの確認は、どのようにされたのでしょうか。たとえコードマッピングができていた
としても、対応するフォントがなければ文字化けするのは当然なのですが。
Goki
会議室デビュー日: 2004/03/02
投稿数: 16
投稿日時: 2004-10-04 17:18
Edosson様、Cluster様、uk様

言葉足らずにかかわらず、色々なご助言を頂き、
ありがとうございます。お手数をおかけして、すみません。
もう少し詳しく話しますと、例えば、人名で、””とかの外字
がLinuxでは登録されていないコードを対象にしています。

Linuxサーバ上では、当然ながらそのありません。
人名でもあるため、これをなんとかLinuxサーバ上にも
表示できるようにしておき、WEBサーバにも表示できるように
したいと思っています。めったにお目に掛かれないような漢字
もあり、これらにどのように対応したらよいのか悩まして
います。

今は暫定的に、Linuxサーバにもサポートしている漢字に
置き換えて表示していますが、他の所ではどのように対応している
のだろうかと思い、投稿させて頂きました。
サーバをWindowsマシンにて統一するしか無いのだろうか
と思っています。

>該当するコードの位置に外字が登録されていれば、使えることもあるとのこと
大体の漢字は、これでほぼ表示できていることを確認できています。
上記の例のような漢字では、無理がありすぎるかと思いつづあります。

ちなみにEUC-JPで作成しています。
(これらを含めて話せばと反省しております。文章力不足で申し訳ございません。
<(_ _)>)

紹介して頂いたキーワード、アドレスを基にして
頑張ってみます。助言、ありがとうございました。
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2004-10-04 22:54
私が以前関わったプロジェクトでは、このようにしました。

まず外字ですが、UCS-2上の私用領域にマップする外字を使いました。
各システムのエンコーディングは以下の通りでした。
DB(Oracle):UTF-8
JSP、サーブレット:Shift_JIS
ブラウザに送るエンコーディング:UTF-8
ブラウザに送るHTMLのフォント:上記のUTF-8の外字フォント

処理の上ではUTF-8からエンコーディング変換をすることはありませんので、
文字化けの心配はありません。JSPには外字は埋め込みませんでした。

なお、ブラウザでフォントを指定していることから分かるように、
クライアントに外字フォントがインストールされている必要があります。

何かの参考にして頂ければ幸いです。
iakio
会議室デビュー日: 2002/11/28
投稿数: 13
投稿日時: 2004-10-05 05:01
多分、JDBCドライバ内で文字コード変換に失敗しているんじゃないかと思います。
LinuxというよりJavaの話だと思います。ちょっと実験してみました。
コード:
		String s = new String(new byte [] {(byte) 0xfb, (byte) 0x50}, "Windows-31J");

System.out.println("s = " + s);

byte [] euc = s.getBytes("EUC-JP");
for (int i = 0; i < euc.length; i++)
System.out.print(Integer.toHexString(euc[i]) + ",");


結果 "21,29,"と、EUC-JPではありえないコードが返ってきました。
また、PostgreSQL上で、
コード:
=> select strtohex(convert('', 'EUC_JP'));

strtohex
----------
8ff4cd


とすると正しい結果が返ってくるようです。

(すいません、この後ウソを書いたようなので一旦削除します)

[ メッセージ編集済み 編集者: iakio 編集日時 2004-10-05 09:40 ]

スキルアップ/キャリアアップ(JOB@IT)