漢字のコード値を求める方法2No.04498
マボカル さん 04/10/13 23:43
 
マボカルと申します。先ほどの04495番の質問の延長になりますが、
気になることがあって、また質問いたします。04495番の質問に対する
回答では以下のように

表示は10進数
insert "u"+str(unicode)+"sjis"+str(code)+" ";
表示は16進数
insert "u"+hex(unicode)+"sjis"+hex(code)+" ";

として、UnicodeとSJISコードの値を求めるマクロが可能でしたが、
その他のコード、つまりJISコードやEUCコードの値を求めることも
可能なのでしょうか?ご教授よろしくお願いいたします。

[ ]
RE:04498 漢字のコード値を求める方法2No.04499
でるもんた さん 04/10/14 02:47
 
でるもんたです。

> 表示は10進数
> insert "u"+str(unicode)+"sjis"+str(code)+" ";
> 表示は16進数
> insert "u"+hex(unicode)+"sjis"+hex(code)+" ";
>
> として、UnicodeとSJISコードの値を求めるマクロが可能でしたが、
> その他のコード、つまりJISコードやEUCコードの値を求めることも
> 可能なのでしょうか?ご教授よろしくお願いいたします。

直接に得る方法はありません。SJISコードから計算することになります。

#hi = code/256 - 0x81;
#lo = code%256;
if (#lo >= 0x80)
 #lo = #lo - 0x41;
else
 #lo = #lo - 0x40;

if (#lo >= 94)
 #hi = #hi*2 + 1;
else
 #hi = #hi*2;

insert "JIS="+str(#hi*256+#lo+0x2121)+",EUC="+str(#hi*256+#lo+0xA1A1);

[ ]
RE:04499 漢字のコード値を求める方法2No.04500
マボカル さん 04/10/14 16:16
 
でるもんたさん

ご回答ありがとうございます。そうですか。直接コード値を求める
ことはできないのですね。

一つ気になりますが、半角英数字やその他空白や改行部分でこのマクロ
を実行すると、コード値がマイナスになっていますが、この値で正しい
のでしょうか。もしかしてこのマクロは全角文字だけ対応しているので
はと思って、質問いたします。

あともう一つ、この値は十進数の値ですが、十六進数でも表すことが
できるでしょうか。多分また計算が面倒くさくなるかもしれませんね。
お時間があればの話です。

[ ]
RE:04500 漢字のコード値を求める方法2No.04501
でるもんた さん 04/10/14 17:01
 
でるもんたです。

> 一つ気になりますが、半角英数字やその他空白や改行部分でこのマクロ
> を実行すると、コード値がマイナスになっていますが、この値で正しい
> のでしょうか。もしかしてこのマクロは全角文字だけ対応しているので
> はと思って、質問いたします。

この計算式は全角の場合にのみ対応しています。
半角か全角かは、この計算の前にあらかじめ変数codeの値を見て調べておく必要が
あります。

(というより、そもそも半角文字にはJISコード、シフトJISコードといった区別は
 ありません。)

> あともう一つ、この値は十進数の値ですが、十六進数でも表すことが
> できるでしょうか。多分また計算が面倒くさくなるかもしれませんね。
> お時間があればの話です。

可能です。str(...) を hex(...) に変えてください。

[ ]
RE:04501 漢字のコード値を求める方法2No.04502
マボカル さん 04/10/14 17:25
 
でるもんたさん

ご回答ありがとうございます。

>この計算式は全角の場合にのみ対応しています。
>半角か全角かは、この計算の前にあらかじめ変数codeの
>値を見て調べておく必要があります。
>(というより、そもそも半角文字にはJISコード、シフトJISコードと
>いった区別はありません。)

そうですか。やっぱり全角文字のみの対応でしたか。半角文字の場合は
あらかじめ全角か半角かをチェックして、半角の場合はマクロ文の計算
を通さずに結果を出せばOKということですね。
分かりました。色々とお付き合い有難うございました。

[ ]
RE:04501 漢字のコード値を求める方法2No.04503
マボカル さん 04/10/14 17:46
 
でるもんたさん

マクロの動きを確認する段階で気づいたことをお話します。

以下のホームページのJIS第一水準漢字・文字コード表では、
http://www.ash.or.jp/code/unitbl21.htm

例えば「亜」についての各コード別の対応に関して、次のように

区 点 JIS  SJIS EUC  UTF-8  UTF-16 字
16 01 3021 889F B0A1 E4BA9C 4E9C   亜

という対応になっていますが、次のマクロで調べると、JISコードと
EUCコードの値がそれぞれ違っています。

「亜」のコード値
JIS 3021 →マクロの結果では 307F
EUC B0A1 →マクロの結果では B0FF

マクロ文の計算が少しおかしいのではないでしょうか。細かい計算の
修正は、コードの仕組みをまだ完全に理解していない私にとっては
大変です。マクロ文のチェックをお願いしてもよろしいでしょうか。

// マクロ文 /////////////////////////////////////////////////

#hi = code/256 - 0x81;
#lo = code%256;
if (#lo >= 0x80)
 #lo = #lo - 0x41;
else
 #lo = #lo - 0x40;

if (#lo >= 94)
 #hi = #hi*2 + 1;
else
 #hi = #hi*2;

message "JIS "+hex(#hi*256+#lo+0x2121)+"\nEUC "+hex(#hi*256+#lo+0xA1A1);

////////////////////////////////////////////////////////////

[ ]
RE:04503 漢字のコード値を求める方法2No.04504
でるもんた さん 04/10/14 18:01
 
いいじまです。

> 「亜」のコード値
> JIS 3021 →マクロの結果では 307F
> EUC B0A1 →マクロの結果では B0FF

あう。間違えていました。

> if (#lo >= 94)
  {
>  #hi = #hi*2 + 1;
   #lo = #lo - 94;   // これを追加
}
> else
>  #hi = #hi*2;
>
> message "JIS "+hex(#hi*256+#lo+0x2121)+"\nEUC "+hex(#hi*256+#lo+0xA1A1);

となります。

コードの計算について少し。
まずJISコードは、上位バイト・下位バイトとも0x21〜0x7Eの範囲を使います。
表にすると94×94のサイズになります。

EUCコードは、ASCII文字と区別するために、JISコードに0x8080を足した値を使います。

シフトJISコードは、さらに半角カタカナ(0xA1〜0xDF)とも区別できるように、
JIS 2121〜217E → SJIS 8140〜817E、8180〜819E
JIS 2221〜227E → SJIS 819F〜81FC
JIS 2321〜237E → SJIS 8240〜827E、8280〜829E
JIS 2421〜247E → SJIS 829F〜82FC
...
としています。

この逆計算をすればいいわけです。

[ ]
RE:04504 漢字のコード値を求める方法2No.04505
マボカル さん 04/10/14 18:24
 
でるもんたさん

マクロ修正どうも有難うございました。これでちゃんとした値を出して
くれます。

>まずJISコードは、上位バイト・下位バイトとも0x21〜0x7Eの範囲を
>使います。表にすると94×94のサイズになります。
>EUCコードは、ASCII文字と区別するために、JISコードに0x8080を
>足した値を使います。
>シフトJISコードは、さらに半角カタカナ(0xA1〜0xDF)とも区別
>できるように、
>JIS 2121〜217E → SJIS 8140〜817E、8180〜819E
>JIS 2221〜227E → SJIS 819F〜81FC
>JIS 2321〜237E → SJIS 8240〜827E、8280〜829E
>JIS 2421〜247E → SJIS 829F〜82FC
>...
>としています。

コードについてもう少し真剣に勉強してみます。大変参考になりました。
どうも有難うございました。

[ ]