作成日: 2020/12/09 最終更新日: 2020/12/09
文書種別
制限事項
詳細
CurrentUICultureを用いて言語をEnからJpに切り替えた場合、Zip内のファイル名を取得すると2バイト文字が文字化けすることがあります。
回避方法
この現象は、本コンポーネントの仕様上の制限です。C1Zipでは、ZIPファイルへの圧縮時、内部的に展開時のエンコードとして「Encoding.Default」を明示的に指定しないために本現象が発生します。
本現象を回避するために、難読化されたC1ZipライブラリのFieldInfoをリフレクションとして指定することで対応する方法が考えられます。
※ビルド4.0.20191.362でZipEncoding.Encodingプロパティが追加されたため、それ以降のビルドではこのEncodingの値を「Default」に設定することで回避可能です。詳細については、以下のナレッジをご参照ください。
◇ナレッジベース(文書番号:84484)
全角文字を含むファイルを圧縮または解凍する時に、ZIP内のファイル名の文字化けを防ぐ方法
◎サンプルコード(VB)
本現象を回避するために、難読化されたC1ZipライブラリのFieldInfoをリフレクションとして指定することで対応する方法が考えられます。
※ビルド4.0.20191.362でZipEncoding.Encodingプロパティが追加されたため、それ以降のビルドではこのEncodingの値を「Default」に設定することで回避可能です。詳細については、以下のナレッジをご参照ください。
◇ナレッジベース(文書番号:84484)
全角文字を含むファイルを圧縮または解凍する時に、ZIP内のファイル名の文字化けを防ぐ方法
◎サンプルコード(VB)
Imports System.Reflection
Imports System.Text
Imports C1.C1Zip
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' 回避方法
Dim assembly As Assembly = Assembly.LoadFrom("C1.C1Zip.4.dll")
Dim t As Type = assembly.GetType("C1.C1Zip.a")
Dim fi As FieldInfo = t.GetField("a", (BindingFlags.Static Or BindingFlags.NonPublic))
fi.SetValue(Nothing, Encoding.Default)
' カルチャの切り替え
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("en", True)
Read()
System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("ja-JP", True)
Read()
End Sub
Private Sub Read()
Dim _zip As C1ZipFile = New C1ZipFile
_zip.Open("..¥..¥Test01.zip")
For Each cze As C1ZipEntry In _zip.Entries
Console.WriteLine(cze.FileName)
Next
_zip.Close()
End Sub
End Class
◎サンプルコード(C#)using System.Reflection;
using System.Text;
using C1.C1Zip;
namespace Zip
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 回避方法(C1ZipライブラリのFieldInfoをリフレクションとして指定)
Assembly assembly = Assembly.LoadFrom("C1.C1Zip.4.dll");
Type t = assembly.GetType("C1.C1Zip.a");
FieldInfo fi = t.GetField("a", BindingFlags.Static | BindingFlags.NonPublic);
fi.SetValue(null, Encoding.Default);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en", true);
Read();
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ja-JP", true);
Read();
}
private void Read()
{
C1ZipFile _zip = new C1ZipFile();
_zip.Open(@"..¥..¥Test01.zip");
foreach (C1ZipEntry cze in _zip.Entries)
{
Console.WriteLine(cze.FileName);
}
_zip.Close();
}
}
}
旧文書番号
86244