Memos About Salesforce

Salesforceにハマってたこと!

【環境依存文字チェックをSalesforceでやる】 第一水準第二水準JIS漢字 入力規則 Apexコード 文字コード範囲 サロゲートペア範囲

f:id:jude2016:20210303230806p:plain
環境依存文字・機種依存文字

こんにちは、管理人の@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)にして、のやり方を採用した。

もっといい方法があればご共有していただけたらいいな。