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水準以降は表示されない」が基本だったかと思いますので、
入力時にエラーにするか、印刷時に類似/代替文字に文字変換を行う対応が理想だと思います。
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水準以降は表示されない」が基本だったかと思いますので、
入力時にエラーにするか、印刷時に類似/代替文字に文字変換を行う対応が理想だと思います。
コメント
コメントを投稿