最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

14.37.UnicodeをEBCDICに変換後の最大データ長

[ Previous ] [ HOME ] [ Upper ] [ Next ]


今度は、UnicodeからEBCDICへの漢字データの送信でのフィールドの最大長を計算で求められるか調べてみましょう。これは、データベースがUnicodeで、印刷フィールドがEBCDICだった場合、その印刷フィールドの長さはどのくらいにすればいいのかが、わからないので、何とか目安を作れないか、というものです。


これは、UnicodeからEBCDICへの漢字データの送信でのフィールドへ複写したときに、つけられるシフトコード(x'0e', x'0f'')の個数の最大数を実証してみましょう。

(例1)

Unicode

1 2

EBCDIC

1 2 3 4
0e 0f

Unicode

1 2
a

EBCDIC

1
a

(例2)

Unicode

1 2 3 4

EBCDIC

1 2 3 4 5 6
0e 0f

Unicode

1 2 3 4
a

EBCDIC

1 2 3 4 5
0e

0f a

(例3)

Unicode

1 2 3 4 5 6
a

EBCDIC

1 2 3 4 5 6 7 8 9
0e 0f a 0e 0f

(例4)

Unicode

1 2 3 4 5 6 7 8
a b

EBCDIC

1 2 3 4 5 6 7 8 9 10
0e 0f a 0e 0f b

(例5)

Unicode

1 2 3 4 5 6 7 8 9 10
a b

EBCDIC

1 2 3 4 5 6 7 8 9 10 11 12 13 14
0e 0f a 0e 0f b 0e 0f

(例6)

Unicode

1 2 3 4 5 6 7 8 9 10 11 12
a b c

EBCDIC

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0e 0f a 0e 0f b 0e 0f c

(例7)

Unicode(データ長14桁まで)

1 2 3 4 5 6 7 8 9 10 11 12 13 14
a b c

EBCDIC

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0e 0f a 0e 0f b 0e 0f c 0e 0f

単純に、0e0fの増分数を調べてUnicodeからEBCDICへ変換した後増える最大バイト数を見ると、このようになっています。

表1

Unicodeのデータ長 0e0fによる増分値
2バイト 0e0f1組で +2 バイト
4バイト 0e0f1組で +2 バイト
6バイト 0e0f2組で +4 バイト
8バイト 0e0f2組で +4 バイト
10バイト 0e0f3組で +6 バイト
12バイト 0e0f3組で +6 バイト
14バイト 0e0f4組で +8 バイト

 

単純な数列なので、計算式ができそうです。

しかし...

(例1)〜(例7)の実際の増加分を調べてみると、

表2

Unicodeデータ長 EBCDIC最大データ長 増分値
2 4 2
4 6 2
6 9 3
8 10 2
10 14 4
12 15 3
14 19 5

表1と表2の増分値を比較すると、表2の増分値が少なくなっています。これは、Unicodeで2バイトの半角文字が、EBCIDICでは1バイトになるためです。う〜む、おかしい。直感ですが、これは、正確な関数はできないみたいな気がします。もし全部漢字なら、前後に0e0fが付くだけです。全部半角なら単純に半分になるだけ。全角半角混合文字では、半角がいくつ入っているかを計算で与えない限り、2バイトが1バイトに減る分を算出するのは無理ですね。なぜなら、0e0fの増加分を推定して増分値を出すことで最大数に近づいても、半角の数でマイナスをしてしまうので、最大値が半角の数により減少してしまうからです。つまり、フィールドの長さだけでは、そのEBCDIC変換した後の最大の長さはわからないことになります。仕方ないですね〜。データの中身を見て、長さを出すことはできますが、それじゃ、このページの趣旨に反します。定義されたフィールドの長さだけで、結果を知りたいのです。

仕方ないので、半角が2バイトから1バイトに減る分は無視することで、0e0fの増分値だけ考慮して最大値、と強引にみなす場合(まあ「最大値」なんだからいいだろうということで)は、計算で簡単に求まります。

Unicodeのデータ長をxとすると0e0fの増分値を求める式は、

int ( x/2 ) + int ( mod ( x/2 , 2 ) )

です。

  A B C D E F G H
1 Unicodeのデータ長 2 4 6 8 10 12 14
2 0e0fによる増分値 2 2 4 4 6 6 8

したがって、

データ長xのUnicodeからEBCDICへ変換した後の最大長(y)は、

y = x + int ( x/2 ) + int ( mod ( x/2 , 2 ) )  (但し 半角変換後の減少分は無視する)

となります。

  A B C D E F G H
1 Unicodeのデータ長 (x) 2 4 6 8 10 12 14
2 EBCDICの最大データ長 (y) 4 6 10 12 16 18 22

セルの計算式は、= C2 + INT(C2/2) + INT(MOD(C2/2,2)) です。

※さらにエレガントな関数を思いついた方は、伝言板に出してくださいませ。

       

2004-6-12


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送