« 7-zip32.dllのUTF-8モードをC#から使用する(2) | トップページ | 文字列にUnicode固有文字が含まれるかのチェック方法 »

2010年12月13日 (月)

7-zip32.dllでサロゲートペア文字を使用した場合の動作結果

※この記事を書いて間もない12/19に、7-zip32.dll Version 9.20.00.02 が公開されました。バージョン履歴の項に、『Unicode モード時に2バイト文字が化ける問題を修正。』とあり、改めてこのバージョンによる検証を行なった結果、このバージョンではサロゲートペアの文字化け問題は解決していました。従って、以下の記事はあくまでも Version 4.65.00.01 を対象としたものであり、最新バージョンでは問題ない事を踏まえた上で読んで下さい。

C#で 7-zip32.dll を使用してみたので、ついでながら、サロゲートペアを使用したファイル名の場合の動作確認も行なってみたいと思います。

本家の 7-zip32.dll (http://akky.cjb.net/download/7-zip32.html) は、サロゲートペアを使用した Unicode ファイル名を使用すると問題がある様です。そして、それを修正したもう一つの 7-zip32.dll (http://homepage1.nifty.com/Ayakawa/soft/ntutil.html) が存在します。ちょっと混乱しそうですが、この違いの比較をしておく事にします。なお、この記事では両者の DLL を区別する為、それぞれ「本家 7-zip32.dll」、「分家 7-zip32.dll」と表現する事にします。

なおサロゲートペア文字は、WindowsVista以降は表示に問題ありませんが、WindowsXPだとJIS2004対応フォント(KB927489)を入れないと、通常は表示出来ません(他にJIS2004に対応したフォントが入っていて、そのフォントで表示する様にすれば、それでも構いません)。
但し、WindowsXPでこのフォントに入れ替えると、他の字体も変わってしまい、特に"2"なんかは違和感を感じますので、相応の覚悟をしてから入れた方がいいです(私自身はかなり前にこれを入れたのですが、入れた当初は元に戻そうかと思った位です。今はもう慣れましたが)。

ちょっと話がそれましたが、JIS2004でのサロゲートペア文字は、304文字あるそうです。さすがに全部の文字で試す気はないので、その一部だけとり、左図の様なファイルを書庫にしてみます。なお、具体的なサロゲートペア文字一覧は、CodeZine の「サロゲートペア入門」にあります。

では、まず本家 7-zip32.dll で書庫を作成して、その書庫一覧を出してみましょう。
下図が、実際に書庫を作成して、書庫一覧(Unicode)を表示した画面です。

しっかり文字が化けてしまいました。解凍もやはりうまくいかず、ファイル自体解凍されません。

このテストAPの解凍はメンバ指定なので、文字化けしたメンバ名を指定している事が原因かもしれません。しかし、メンバ指定部分を"*"にして一括解凍すると、解凍こそされましたが、エクスプローラで見ると、別の文字コードになっているらしく、左図の様に文字が化けています。

どうやら噂どおり、サロゲートペア文字だと問題ある様です。では、分家 7-zip32.dll は問題無く動作するのかもチェックしてみます。本家のチェックと同様、分家 7-zip32.dll で書庫を作成して、その書庫一覧を出してみましょう。
下図が、実際に書庫を作成して、書庫一覧(Unicode)を表示した画面です。また、本家で作成した書庫を、分家で書庫一覧を表示した状態も一緒に示してみます。

分家で作成した書庫を分家で一覧表示本家で作成した書庫を分家で一覧表示

分家で作成した書庫は、一覧もきちんと表示されますが、本家で作成した書庫は一覧が正常に表示出来ない事からも、本家は書庫作成時点で問題があるのが判ります。
また、分家で作成した書庫は、きちんと解凍も出来ます。

また、本家で試した一括解凍も問題無く、左図の様に正しいファイル名で解凍されました。

この様に、サロゲートペアを含むファイル名の場合、本家では問題がある事から、7-zip32.dll の UTF-8 モード使用時には、分家の 7-zip32.dll を使用する様な配慮が必要かもしれません。
なお、本家か分家か、アプリケーション側で区別するには、分家側に用意されている AltSevenZipVersion(), AltSevenZipSubVersion() のAPIが存在するかどうかで区別出来る様です。

では以上で、7-zip32.dll のサロゲートペア文字付きファイルのテストを終了したいと思います。

« 7-zip32.dllのUTF-8モードをC#から使用する(2) | トップページ | 文字列にUnicode固有文字が含まれるかのチェック方法 »

C#研究」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 7-zip32.dllでサロゲートペア文字を使用した場合の動作結果:

« 7-zip32.dllのUTF-8モードをC#から使用する(2) | トップページ | 文字列にUnicode固有文字が含まれるかのチェック方法 »