14.37.UnicodeをEBCDICに変換後の最大データ長 |
今度は、UnicodeからEBCDICへの漢字データの送信でのフィールドの最大長を計算で求められるか調べてみましょう。これは、データベースがUnicodeで、印刷フィールドがEBCDICだった場合、その印刷フィールドの長さはどのくらいにすればいいのかが、わからないので、何とか目安を作れないか、というものです。 これは、UnicodeからEBCDICへの漢字データの送信でのフィールドへ複写したときに、つけられるシフトコード(x'0e', x'0f'')の個数の最大数を実証してみましょう。 (例1)
(例2)
(例3)
(例4)
(例5)
(例6)
(例7)
単純に、0e0fの増分数を調べてUnicodeからEBCDICへ変換した後増える最大バイト数を見ると、このようになっています。 表1
単純な数列なので、計算式ができそうです。 しかし... (例1)〜(例7)の実際の増加分を調べてみると、 表2
表1と表2の増分値を比較すると、表2の増分値が少なくなっています。これは、Unicodeで2バイトの半角文字が、EBCIDICでは1バイトになるためです。う〜む、おかしい。直感ですが、これは、正確な関数はできないみたいな気がします。もし全部漢字なら、前後に0e0fが付くだけです。全部半角なら単純に半分になるだけ。全角半角混合文字では、半角がいくつ入っているかを計算で与えない限り、2バイトが1バイトに減る分を算出するのは無理ですね。なぜなら、0e0fの増加分を推定して増分値を出すことで最大数に近づいても、半角の数でマイナスをしてしまうので、最大値が半角の数により減少してしまうからです。つまり、フィールドの長さだけでは、そのEBCDIC変換した後の最大の長さはわからないことになります。仕方ないですね〜。データの中身を見て、長さを出すことはできますが、それじゃ、このページの趣旨に反します。定義されたフィールドの長さだけで、結果を知りたいのです。 仕方ないので、半角が2バイトから1バイトに減る分は無視することで、0e0fの増分値だけ考慮して最大値、と強引にみなす場合(まあ「最大値」なんだからいいだろうということで)は、計算で簡単に求まります。 Unicodeのデータ長をxとすると0e0fの増分値を求める式は、
です。
したがって、 データ長xのUnicodeからEBCDICへ変換した後の最大長(y)は、
となります。
セルの計算式は、= C2 + INT(C2/2) + INT(MOD(C2/2,2)) です。 ※さらにエレガントな関数を思いついた方は、伝言板に出してくださいませ。 2004-6-12 |
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||