<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jinfeng_wang

    G-G-S,D-D-U!

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks

     

    http://park3.wakwak.com/~ozashin/sw_tips/webapp_tips/sjis_charset.html

    文字コードについて(シフトJISの問題)

    文字コードをシフトJISで開発し、Windowsのサーバで動かす場合の文字コード問題について示します。

    厳密にいうとWindowsが扱う文字コードは、シフトJISでは、ありません。MS932です。または、コードページ CP932ともいいます。MS932は、マ社がシフトJISを拡張して定義したコード體系です。

    で、ここで何が問題になるかというと、クライアントへの出力をcharset="Shift_JIS"とか定義して、アプリケーションサーバーなど が一生懸命シフトJISで出力しようとすると、ある文字列が文字化けするのです。ようは、MS932にある文字コードはシフトJISには、ないので、'? 'で出力されるということです。なお、OC4JやJBuilderで利用するtomcatは、MS932で出力しようとするので、あんまり文字化けしませ ん。

    Java內部で扱う文字コードは、Unicodeです。ここでシフトJISとUnicodeのマッピングとMS932とUnicodeのマッピング の違いによって、思わぬ、文字化けが発生するのです。ちなみに、JSPファイルにじか書きしてあるもじは、そのまま出力されるので問題はありません。
    Javaプログラムを通して、Unicodeからcharsetで定義された文字が出力されるとき文字化けの対象となります。

    具體的には、'~'、'∥'、'-'、'¢'、'£'、'¬'などの一部の記號類です。
    日本語のUnicodeベンダ依存文字表 http://www.ingrid.org/java/i18n/unicode.html を參照してください。

    というわけで、Windowsで動かすのであれば、charsetを"Windows-31J"にしましょう!そうすれば、一部の文字コードを除い て解決です。
    JSPの場合は、<%@ page contentType="text/html; charset=Windows-31J" %>と定義します。
    Servletでは、

    	private static final String CONTENT_TYPE = "text/html; charset=Windows-31J";
    ....
    response.setContentType(CONTENT_TYPE);
    

    のように実裝します。charset="MS932"でもOKですが、http://www.ingrid.org/java/i18n/encoding/shift_jis.htmlに あるとおり、これからは、Windows-31Jでいくようです。


    WAVE DASH問題(TILDE問題)

    シフトJISがらみでもうひとつWAVE DASH問題(TILDE問題)というのがあります。これは、JDBCがらみというか、データベースの文字セットの問題というか、誰が根本的な原因かわか らないところがあります。Unicodeの実裝が厳密に定義されていないので、ベンダごとで実裝の仕方が違っているそうです。

    Oracleを例にとって文字の流れを以下に示します。テスト環境は以下のとおり。

    OS Windows2000
    データベースサーバ Oracle8i R8.1.7
    DB內部コード JA16SJIS

    ある入力フィールドに '~' を含んだ文字列を設定し、それをデータベースへ格納し、參照する場合、文字変換の流れは以下のようになります。

    1. ブラウザ上では、Windows-31J(MS932)なので、'~'=0x8160
    2. Javaプログラム內部では、Unicodeなので、JisAutoDetectなどで変換して、'~'=0xFF5E (FULL WIDTH TILDE)
    3. データベースに格納された結果は、JA16SJISなので、'~'=0x8160
    4. Javaプログラムがデータベースから文字をGETしたとき、'~'=0x301C (WAVE DASH)
    5. 0x301Cを応答として出力すると、0x8160にマッピングできないので '?'となる。

    この問題は、上記のようにcharsetをWindows31Jにしても回避できません。

    ちなみに、Unicodeでいうところの '~' は、0x301C (WAVE DASH)になるのが、Unicodeコンソーシアムでは正しい実裝方法だそうです。

    (4)で、0x301Cに変換されているんだからOKじゃん、と思いますが、0x8160を0xFF5Eに変換するんだから、0x8160にするに は、0xFF5Eにしてあげなければならないのです。

    この問題を回避するには、2通りあります。

    1. (4)で0x301Cで変換された文字を0xFF5Eに再変換する。
    2. Oracle9i R9.2以降でMS932がサポートされたデータベース內部コード "JA16SJISTILDE"を利用する。

    しかし、(1)では、データベースをアクセスするたび、毎回再変換するので、パフォーマンスが落ちます。(2)では、いまさらOracle9に移行 できる予算がないし、検証しているひまもないという問題があります。
    したがって、第3の回避方法として、運用で逃げる('~'は、システム上扱えないコードとしてユーザに我慢してもらう)という手もあります。

    ちなみに、私は、多少パフォーマンスが落ちてもOKということで、(1)で再変換の道を選びました。

    まぁ、最初からOracle9iR9.2を選んでいれば、OKですけどね。また、検証はしていませんが、EUC-JPでも同様の問題があって、 Oracle9iR9.2からJA16EUCTILDEがサポートされているようです。


    參考(Javaのデフォルトコンバータの推移)

    Windowsで動かし、JISAutoで変換した場合のデフォルトコンバータは、誰の都合か知りませんが、以下のように変化しました。
    まぁ、Windowsで動かす限り、Windows-31Jをcharsetにしておけば、JDK1.4.1以降でもOKのようです。

    JDKのバージョン デフォルトコンバータ 実裝されたコンバータ
    JDK 1.1.7以前 SJISコンバータ  
    JDK 1.1.8 SJISコンバータ MS932コンバータが実裝される
    JDK 1.2 ~ 1.4.0 MS932コンバータ  
    JDK 1.4.1 SJISコンバータ  
    それ以降 保証なし?  
    posted on 2009-11-27 20:51 jinfeng_wang 閱讀(3096) 評論(0)  編輯  收藏 所屬分類: javaZZ
    主站蜘蛛池模板: 国产免费一区二区视频| 天堂亚洲免费视频| 中文字幕天天躁日日躁狠狠躁免费 | 亚洲中文字幕无码一区| 日韩在线视频播放免费视频完整版 | 免费v片在线观看品善网| 精品韩国亚洲av无码不卡区| 午夜男人一级毛片免费| 亚洲国产成人综合精品| 国产精品另类激情久久久免费| 亚洲av无码成人精品区一本二本 | 亚洲三级在线视频| 国产乱码免费卡1卡二卡3卡| 亚洲区视频在线观看| 成人毛片18女人毛片免费96 | 一本久久a久久精品亚洲| 一个人免费视频观看在线www| 亚洲成AV人片在线观看ww| 久久青草免费91线频观看站街| 国产成A人亚洲精V品无码性色| 91香焦国产线观看看免费| 亚洲国产成人手机在线电影bd| 成年大片免费视频| 青娱乐在线视频免费观看| 国产国拍亚洲精品福利| 久久综合给合久久国产免费| 久久精品国产亚洲AV忘忧草18| 精品久久洲久久久久护士免费 | 国产精品成人啪精品视频免费| 国产成A人亚洲精V品无码性色| 18国产精品白浆在线观看免费| 亚洲丶国产丶欧美一区二区三区| 亚洲国产成人久久精品99| 中文字幕日本人妻久久久免费| 亚洲无人区视频大全| 吃奶摸下高潮60分钟免费视频| 免费无码又爽又刺激高潮软件| 亚洲一区中文字幕| 久久久久国产亚洲AV麻豆 | 亚洲AV无码成人专区片在线观看| 日韩视频在线精品视频免费观看 |