はじめに
この記事では、業務でぶつかった課題(環境依存文字の有無を確認する方法)について、備忘録としてまとめたものです。
より良い方法があるかもしれませんが、このページへたどり着いた方の解決の一助となれば幸いです。
サンプルソース
Githubにプロジェクトのサンプルをアップしました。
今回の課題
人名などにたまに含まれる外字(鬼滅の刃に出てくる竈門禰豆子(ねずこ)の「ね」の字や、高橋(髙橋)さんの「髙(はしごだか)」など。異体字や旧漢字と呼ばれることもあるみたいです)は、取得・出力するフォーマットによっては文字化けすることがあります。
(変換の時に[環境依存]という表記が出てきます)
↑ねずこの「ね」、Excelなどで入力しようとすると・や□という形になってしまい何と書かれているのか読み取れない
大量のデータを取り扱う場合、うっかり該当の文字が含まれる値を入力しようとして予期しないエラーや人の目によるチェック時に判別できない等様々な不具合が発生する恐れがあるため、外字が含まれているか否かをチェックし、処理を振り分けできればと考えました。
(本当は文字化けしない文字への変換も検討したのですが、あまりに数が膨大すぎるので諦めました…)
どのように外字を判別するのか?
外字はUNICODEの場合 文字コードがE000~F8FFの範囲(私用領域)のいずれか となっているそうです。
Unicodeでは、外字エリアとして私用領域という名称でU+E000〜U+F8FF、U+000F0000〜U+000FFFFD、U+00100000〜U+0010FFFDに外字領域を設けてある。(Wikipediaより引用)
つまり、以下の手順でチェックが可能ということ!
①チェックしたい文字列を1文字ずつに分解
②分解した1文字のUNICODEでの文字コードを取得
③取得した文字コードがE000~F8FFの範囲に含まれているか確認
UiPathで実装するなら…
UiPathで実装する場合は、今回筆者は以下の方法で実装しました。
①チェックしたい文字列を1文字ずつに分解
分割したい文字列 .ToCharArray で1文字ずつのChar型に分解
分解した配列を「繰り返し(コレクションの各要素)」アクティビティに渡してあげることで、1文字ずつに対しチェックを行えるようになりました。
②分解した1文字のUNICODEでの文字コードを取得
AscW(文字列) で指定した文字列のUnicode文字コードを取得
VB.NetのStrings.AscWメソッドを使用することで、文字コードをInt32型で取得できます。
Excelでいう、 UNICODE関数 と同じ働きをしてくれます。
③取得した文字コードがE000~F8FFの範囲に含まれているか確認
あとは取得した文字コードが指定範囲内に含まれているかのチェックのみです。
ただし、記載した範囲は16進数の文字列、対して取得した文字コードは10進数の数値となっているため、
比較ができるよう同じ数値型(10進数)に揃える必要があります。
16進数→10進数への変換
convert.ToInt32(16進数の文字列,16) で16進数で記載された文字列を10進数の整数へ変換
参考サイト:Convert.ToInt32メソッド(Microsoft Docs)
Excelでいう、 HEX2DEC関数 と同じ働きをしてくれます。
(参考)10進数→16進数への変換
convert.ToString(10進数の数値,16) で10進数で記載された整数を16進数の文字列へ変換
参考サイト:Convert.ToStringメソッド(Microsoft Docs)
Excelでいう、 DEC2HEX関数 と同じ働きをしてくれます。
最後に
今回のようにUiPathとしての対処方法については出てこなくても、ExcelやVB.Netとしての対処・解決方法は調べてみると案外すぐ出てくる傾向にあります。
VB.Netの場合はそのまま流用できたり、Excelでの実装方法についても工夫すればUiPathでも同じ機能を持った処理を行うことができるので、
ヒントを得るために調べてみるのも一手かもしれません。
また、今回筆者のケースでは上記の方法で対応できましたが、環境によってはうまく行かない可能性もあります。
参考程度に捉えていただけると幸いです。