漢字の処理に付いて [▲BACK]

2000年の漢字って何?


拡張漢字コード (JIS X 0213:2000)

2000年1月20日に日本工業規格(JIS)なった新しい規格です。 この漢字コードは、第三/第四水準漢字と呼ばれる様です。 新しい規格なので、今のWindows98等では使用できません。 ただ、今後発売されるWindows Me(Meは含まない)以降で採用されそうな感じです。 (確証は無いけど) となると、今までとどの様に違うか気になります。

Windowsの漢字

Windows95/98内部の漢字コードとしてUnicodeが使われています。 最初アメリカの企業が集まって世界の文字をコード化する目的で作られたコードです。 その為Unicodeは、日本の漢字以外に中国や韓国の漢字,はたまた色々な国の文字をコード化しています。 これを使う事により、Windowsの他国語版が作りやすくなっています。(本当?使いづらいぞ)

第三/第四水準漢字(JIS X 0213:2000)の約5000字の内の約300字がこのUnicodeに入っていません。 というより、新しい規格の漢字がなぜ入っているか補助漢字コード(JIS X 0212)が有るためです。 この補助漢字コードは、特定のアプリケーションでは使えるのですが通常のテキストファイルの漢字として使用できなかったのです。 (Unicodeやeuc,jisコードでは、表示可能だがsjisでは、表示できない。)

上記のUnicodeに入っていない約300字が今後どう扱われるかによりWindowsで採用されるか変わって来ると思います。

第一/第二水準漢字と第三/第四水準漢字の関係

規格の話になりますが
8836文字 が第一/第二/第三水準漢字を合わせた最大数になります。
2444文字 が第四水準漢字の最大数になります。
ただし、字形が無いコードもありますのですべて文字が表記できるわけではありません。

なぜ上記で二つに分けたかというとJISの漢字コードの配置にあります。 最初の8836文字は、今までと同じShift-JISの符号化方法で使えるのです。 次の2444文字は、新たな符号化方法を必要とする部分です。

第三水準漢字は、第一/第二水準漢字の隙間(字形が無いコードの事)に配置されました。 その為、かなり飛び飛びに入り込んでいます。
(1面1区〜1面94区までの漢字)

第四水準漢字は、新しい面に配置されます。 またこの面は、補助漢字(JIS X 0212)とぶつからない様に配置されます。 (sjis や euc の符号化方法を考慮してあるみたいです。)
(2面1区,2面8区,2面3区〜2面5区,2面12区〜2面15区,2面78区〜1面94区の漢字が第四水準漢字)

Shift-JISの符号化方法

まだテスト段階ですが、戻り値に漢字コードが入ります。

JIS から Shift-JISへ(2000/08/15修正)

unsigned short _jis2sjis(const unsigned short jis, const int plane)
{
    unsigned short hic, loc;
    hic = (jis & 0xff00) >> 8;
    loc = (jis & 0x00ff);
    /* JIS X 0213:2000 */
    if (plane == 2) {
        if      (hic == 0x21 || (0x23 <= hic && hic <= 0x25))
            hic += 0x5e;
        else if (hic == 0x28 || (0x2c <= hic && hic <= 0x2f))
            hic += 0x58;
        else if (hic >= 0x6e)
            hic += 0x1a;
        else return 0;
    }
    /* jis -> sjis */
    loc += (hic & 0x01) ? 0x1f : 0x7d;
    if (loc >= 0x7f) loc++;
    hic = ((hic - 0x21) >> 1) + 0x81;
    if (hic > 0x9f) hic += 0x40;
    return (hic << 8) | loc;
}

引数
jis : 変換前のJISコード
plane : 変換前のの面番号(1 or 2)

戻り値
シフトJISコード


Shift-JIS から JISへ(2000/08/15修正)

unsigned short _sjis2jis(const unsigned short sjis, int *plane)
{
static unsigned short table[][2] = {
    {0x81, 0x84}, {0x82, 0x82}, {0x83, 0x86},
    {0x87, 0x87}, {0x88, 0xe7} };
    unsigned short hic, loc;
    hic = (sjis & 0xff00) >> 8;
    loc = (sjis & 0x00ff);
    /* JIS X 0213:2000 */
    if (plane) *plane = (0xf0 <= hic) ? 2 : 1;
    if (0xf0 <= hic && hic <= 0xf4)
        hic = table[hic - 0xf0][(loc <= 0x9e) ? 0 : 1];
    else if (hic >= 0xf5) hic -= 0xd;
    /* sjis -> jis */
    hic -= (hic <= 0x9f) ? 0x71 : 0xb1;
    hic  = (hic << 1) + 1;
    if (loc > 0x9e) hic++;
    if (loc > 0x7f) loc--;
    loc -= (loc >= 0x9e) ? 0x7d : 0x1f;
    return (hic << 8) | loc;
}

引数
sjis : 変換前のシフトJISコード
plane : 変換後の面を返すアドレス。(NULL時は返さない)

戻り値
JISコード および 面番号(1 or 2)


注意:この変換方法が合っているとは限りません。

また、この元になっているのは、web上に公開されている最終案を基にしています。
参考 : http://jcs.aa.tufs.ac.jp/jcs/fdis-an.htm 2021/05 リンク切れ
変換ルーチンは、下記を参考にしています。
参考 : http://alfin.mine.utsunomiya-u.ac.jp/index.html 2021/05 リンク切れ


トップページへ  ソフトウェアに戻る (S)
Copyright(c) 1997-2000 莎華(SAKA) / mail:saka@sf.airnet.ne.jp (M)