こんにちは、管理人の@Salesforce.Zです。
環境依存文字チェック、機種依存文字チェックをSalesforceでやりたい、
今回、環境依存文字チェック あるいは 機種依存文字チェックをSalesforceでやる場合の方法を共有する
1.入力規則でやる方法
2.Apexコードでやる方法
★ 1.入力規則でやる方法 ★ 2.Apexコードでやる方法
目次
環境依存文字チェック / 機種依存文字チェック
まず正規表現サンプルパターンについて、先に見ておいたほうが、後の内容を理解しやすいでしょう
環境依存文字のシンプル分け方をチェックしてから、環境依存文字チェックの仕組みも分かるでしょう
いずれも理解してから、ようやく、文字コード表 シフトJIS(Shift_JIS)を見て、全体的に理解でき、
環境依存文字とはなにか分かってくるはず。要するに文字コード表 シフトJIS(Shift_JIS)の中に幽霊字となる部分が機種によって
表現できない場合があるということ
SFDCの入力規則での環境依存文字チェック
第一水準JIS第二水準JIS【漢字の範囲】の入力規則
第一水準JIS漢字の範囲:亜-腕
第二水準JIS漢字の範囲:弌-熙
問題点:漢字のみ入力許可できる、他の必要(英数字、全角半角かな)がある場合、拡充する必要がある。
!REGEX( OP_INPUT__c , "^[亜-腕弌-熙]+$")
第一水準JIS第二水準JIS【サロゲートペアの範囲】の入力規則
第一水準JIS漢字の範囲:\u4E9c-\u8155(\がメタ文字のため、2つで、文字として扱い)
第二水準JIS漢字の範囲:\u5F0C-\u7199(\がメタ文字のため、2つで、文字として扱い)
問題点:漢字のみ入力許可できる、他の必要(英数字、全角半角かな)がある場合、拡充する必要がある。
!REGEX( OP_INPUT__c , "^[\\u4E9c-\\u8155\\u5F0C-\\u7199]+$")
第一水準JIS第二水準JIS【文字コードの範囲】の入力規則
第一水準JIS漢字の範囲:\x{889F}-\x{9872}(\がメタ文字のため、2つで、文字として扱い)
第二水準JIS漢字の範囲:\x{989F}-\x{EAA4}(\がメタ文字のため、2つで、文字として扱い)
問題点:保存できるが、動作しない(できる人がいたら、コメントしていただけると助かります)
!REGEX( OP_INPUT__c , "^[\\x{889F}-\\x{9872}\\x{989F}-\\x{EAA4}]+$")
Apexコードでの環境依存文字チェック
考え方
1.符号化(ふごうか):指定文字をエンコードクラスで、変換する ➜ 結果をエンコードAとする
2.平文に直す:エンコードAをデコードクラスで変換する ➜ デコードBとする
#2で元に戻せるかという考え方になる。戻せなかったら、その文字コードマップにないということである。
Apexコードでの環境依存文字チェック例
String value = 'テスト文字列'; String charset = 'ISO-2022-JP'; // 指定文字コードに変換 String encode = EncodingUtil.urlEncode(value, charset);//valueがnullチェックをする必要がある➜String.isNotEmpty(value) String decode = EncodingUtil.urlDecode(encode, charset); // 変換前後で比較 if (value != decode) { System.debug('平文に直せなかったため、環境依存文字である'); }else{ System.debug('平文に直せたため、環境依存文字ではない'); }
その他Salesforceで使用可能な正規表現の入力規則
最後
漢字の範囲で入力規則とサロゲートペアの範囲での入力規則は、漢字のみ許可になる
文字コードの範囲での入力規則は、保存できる、だが、なんでもエラー
私が使ったのは、Apexコードで、文字コード(ISO-2022-JP)にして、のやり方を採用した。
もっといい方法があればご共有していただけたらいいな。