IVS文字・サロゲートペア文字の注意

システムの中で文字数を取得する際にはIVS文字・サロゲートペア文字に注意が必要です。

IVD/IVSとは | 文字情報基盤整備事業
https://mojikiban.ipa.go.jp/1292.html

サロゲートペア入門:CodeZine(コードジン)
https://codezine.jp/article/detail/1592


例えば、エラーチェックで指定した「文字数」で固定する場合
最大「文字数」を超えているかチェックする場合

GeneXusでは&変数.Length()か、またはLen(&変数)で文字数を取得することが出来ます。
但し、上記のIVS文字・サロゲートペア文字の場合は、
見た目の1文字が1文字として算出されません。

試した環境:GeneXus15U10

通常文字 :辻
IVS文字:辻の点が1つの文字

このLengthを求めると、以下の結果となります。
通常文字 :1文字
IVS文字:3文字

---------

通常文字     :叱
サロゲートペア文字:叱(環境依存)

このLengthを求めると、以下の結果となります。
通常文字     :1文字
サロゲートペア文字:2文字


※IVS文字とサロゲートペア文字を試したい場合は、Windowsの設定を変更する必要があります。
 Microsoft IMEの場合
  ・IMEのプロパティから[詳細設定]
  ・[変換]タブの[詳細設定]
  ・変換文字制限に
     変換文字制限をしない
     IVSを含む文字を制限する
     サロゲートペアを含む文字を制限する
   といった候補が出ますので、[変換文字制限をしない]をチェックしてください。
   これで変換候補にIVS文字とサロゲートペア文字が出てきます。

  ※※※
    試した後は、戻しておいた方が良いです。
    メールなどで送ってしまうと相手に迷惑ですので。



ちなみにBytecount()を使用してバイト数(文字コードはUTF-8)を取得すると
以下の結果となります。

通常文字 :辻
IVS文字:辻の点が1つの文字
↓↓↓
通常文字 :3バイト
IVS文字:7バイト

---------

通常文字     :叱
サロゲートペア文字:叱(環境依存)
↓↓↓
通常文字     :3バイト
サロゲートペア文字:4バイト




なぜそうなるのか?
は、私には難しいので、冒頭のリンク先を見てください。


GeneXusは画面・内部処理はUnicodeで動作します。
DBもデフォルトはUnicodeですし、それがお勧めです。

Unicodeであれば、IVS文字もサロゲートペア文字も表示は問題ありません。
入力された場合もきちんとDBに登録されます。

但し、Lengthを使った場合や、HTMLのMAXLENGTHで入力制限が掛かる場合には、
上記の結果の文字数での動作になりますのでご注意ください。


ちなみに帳票では文字がでません。
帳票は「第3水準以降は表示されない」が基本だったかと思いますので、
入力時にエラーにするか、印刷時に類似/代替文字に文字変換を行う対応が理想だと思います。

コメント

このブログの人気の投稿

Tomcatの設定3:8080ポート以外で動作させる

GeneXusのオプション設定、起動時オプション

Tomcatの設定5:メモリ調整と起動モード

Tomcatで画面表示の速度改善

Tomcatの設定1:データソースを使用する方法とメリット