RPAエンジニアの雑記

RPA(Blue Prism)について色々記載してます。

(BluePrism)Utility - Windows Compressed Fileが日本向けじゃない件

ご無沙汰しております。おむおむです。


年末年始で公私ともにバタバタしており、
なかなかアウトプットの時間が取れず。。。
引っ越しって面倒だなぁ(詠嘆)




Utility - Windows Compressed Fileとは

その名の通りファイルを圧縮したり、展開するためのVBOです。
v6.5から導入されたやつです。 パスワード付きZipの操作はできません。
そんな面倒な運用してんじゃねぇ!という
英国からの圧を感じざるを得ません(違う)


v6.10現在、使用できるアクションは以下の通り。
処理内容は、まあ、名前のまんまです。

・Add File to Zip
・Create Zip from Folder
・Delete File from Zip
・Extract All from Zip
・Extract File from Zip
・Find File in Zip
・Get Zip Contents



使ってみると・・・?

例として、「Extract All from Zip」アクションを使って
Zipファイルを展開してみます。

テスト用に、Cドライブ直下に「temp」というフォルダを作り、
その中に「test.zip」というZipファイルを用意します。
f:id:newgraduate19:20210208120332p:plain

中身はこんな感じです。
f:id:newgraduate19:20210208120342p:plain

アクションの入力パラメータは、
Zipファイルのフルパスと展開先のフォルダパスです。
シンプル。
f:id:newgraduate19:20210208121734p:plain

Cドライブのtempフォルダ配下に
そのまんま「test」という名前で展開しましょう。
f:id:newgraduate19:20210208122012p:plain

はいできました。
中身見てみましょう。
f:id:newgraduate19:20210208122156p:plain

文字化けしてるじゃないですかヤダー

f:id:newgraduate19:20210208122357p:plain

ちなみに、他のアクションを使用しても
ファイル名にダブルバイト文字が含まれていると
同様に文字化けが発生します。


原因を考える

恐らく文字コードが違うからでしょう(ズバリ)。


今までファイルの中身の文字化けについては
何度か遭遇したことがありますが、
ファイル名の文字化けはあまり見かけませんでした。

Lhaplusとか7-Zipとか使ってると
自動的にいい感じにアレしてくれてるからでしょう(雑)

が、このVBOで使用されているZipFileクラス
特に指定しない場合UTF-8でデコードしようとするみたいです。
そのため、Windowsのシステムロケールが日本になっていると
ファイル名にShift-JISが使われるため
文字化けが発生する、ということだと思います。
たぶん。おそらく。知らんけど。


というか、Windowsのファイル管理システムのNTFS
Unicodeでファイル名を保存しているので
そのまんま使えばいいものの、
システムロケールでShift-JISが指定されていると
WindowsAPIか何かでANSI(Shift-JIS)に変換されるのでしょうか?
マジでわからないので誰か教えてください...
docs.microsoft.com


解決法

原因は、まあ、さておき。
解決方法を以下に書いていきます。
もちろん自己責任でお願いします。


方法1. 外部の圧縮ファイル操作アプリケーションを使用する

これが一番手っ取り早い気がします。

7-Zipとか、Lhaplusとかです。
だいたいこれらのようなアプリケーションは、
コマンドラインから操作できるようになっているので、
Utility - EnvironmentRun Process Until Endedを使用することで
比較的容易にZipファイルの操作が可能です。

例えば7-Zipを使用する場合、入力パラメータはこんな感じ。
(7-Zipはデフォルトのインストールフォルダにある前提です)

・Application : C:\Program Files\7-Zip\7z.exe
・Arguments : x -o<展開先のフォルダパス> <Zipファイルのフルパス>
・Working Folder : 指定なし
・Timeout : MakeTimeSpan(0, 0, 0, 30)

f:id:newgraduate19:20210211151441p:plain


便利ですね。Igor Pavlovさんに感謝です。

そのほかのオプション(パスワード付きZipの作成とか)は
7z.exe -?とかで調べてくださいな。


方法2. VBOのコードステージを書き換える

ここからは推奨しないので読み飛ばしてOKです。
だって実装めんどいし!


何をするかというと、コードステージを書き換えて
Shift-JISに対応させる、ただそれだけです。


まずはVBOを別名保存します。
Utility - Windows Compressed File - Extendedとかでいいと思います。
f:id:newgraduate19:20210211154709p:plain

次に、初期化ページから名前空間System.Textを追加します。
f:id:newgraduate19:20210211154954p:plain

あとは各アクションでShift-JISを使用するように書き換えるだけです。
書き換える「だけ」、といいつつも、
引数だけでなくメソッドを変更するものもあるのでご注意を。


例えば、「Extract All from File」の場合は

ZipFile.ExtractToDirectory(sourcePath, destinationPath)

↓

ZipFile.ExtractToDirectory(sourcePath, destinationPath, Encoding.GetEncoding("shift_jis"))

と第3引数を追加するだけで済みますが、

docs.microsoft.com

「Get Zip Contents」の場合は9行目を

Using archive As ZipArchive = ZipFile.OpenRead(path)

↓

Using archive As ZipArchive = ZipFile.Open(path, 0, Encoding.GetEncoding("shift_jis"))

とする必要があります。

docs.microsoft.com

面倒だね☆


方法3. システムロケールを変更する

最後は、システムロケールを変更する方法です。
ゴリゴリに非推奨です。

要はファイル名にShift-JISが使われなければいいので、
そこを変更してしまおう、ということです。

まずはコントロールパネルの「地域」を選択し、 f:id:newgraduate19:20210211161413p:plain

「管理」タブの「システムロケールの変更」から英語圏などを選択する、
もしくは「ベータ版: ワールドワイド言語サポートでUnicode UTF-8を使用」
にチェックを入れ、端末を再起動します。
f:id:newgraduate19:20210211163007p:plain
f:id:newgraduate19:20210211163054p:plain


注釈にもある通り、端末内のユーザ全体に影響が出るので
おすすめしないです。
特にバッチファイルを現役で使用しているような環境では
影響出まくりハマグリだと思います。

チェックボックスの項目がベータ版なのは、
多分コードページをUTF-8(CP65001)に変更することによる
影響等を完全にはチェックできてないから、とかそんな理由でしょう。
多分。知らんけど。


まとめ

7-Zipは有能
・早くShift-JISから脱却したい
・今日のコメダ珈琲はちょっと暑い

今さらながらパラサイト 半地下の家族観ました。
心がしんどくなったのでお寿司でも食べよう。。。