2009-09-29 42 views
2

您是否知道一些Java庫/路徑,以便在適當的Windows國家代碼頁(例如cp1250)中生成帶有文件名的tar檔案。在Java中使用全國性字符創建tar檔案

我試圖與Java tar,示例代碼:

final TarEntry entry = new TarEntry(files[i]); 
String filename = files[i].getPath().replaceAll(baseDir, ""); 
entry.setName(new String(filename.getBytes(), "Cp1250")); 
out.putNextEntry(entry); 
... 

它不工作。在Windows中提取焦油的地方,國家字符被破壞。 我還發現了一個奇怪的東西,在Linux下波蘭語字符顯示正確,只有當我用ISO-8859-1:

entry.setName(new String(filename.getBytes(), "ISO-8859-1")); 

儘管適當波蘭代碼頁ISO-8859-2,其中不起作用。 我也試過Windows的Cp852,沒有效果。

我知道tar格式的限制,但改變它不是一個選項。

感謝您的建議,

回答

1

正式地,TAR不支持標頭中的非ASCII。但是,我能夠在Linux上使用UTF-8編碼的文件名。

你應該試試這個,

String filename = files[i].getName(); 
byte[] bytes = filename.getBytes("Cp1250") 
entry.setName(new String(bytes, "ISO-8859-1")); 
out.putNextEntry(entry); 

這至少保持在TAR頭在CP1250的字節數。

+0

非常感謝!有用。 在Windows中解包後的國家字符都可以。 我必須看看構造''新字符串(filename.getBytes(「Cp1250」),「ISO-8859-1」)''並正確理解它。 – pawelsto 2009-09-30 08:37:55

+1

你必須閱讀TAR代碼才能看到它的工作原理。 TAREntry不理解編碼。它只是將UTF-16字符的低位字節複製到TAR文件。在Unicode中,低位字節完全映射到Latin-1,所以我們使用Latin-1來保存字節數組。它完全與拉丁-1編碼無關。 – 2009-09-30 12:22:02

0

tar在其標頭中不允許使用非ASCII值。如果您嘗試使用不同的編碼,結果可能會達到目標平臺決定對這些字節值做什麼。這聽起來像是你的目標平臺的tar程序正在將字節解釋爲ISO-8859-1,這就是爲什麼'有效'。

看看擴展屬性? http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5&manpath=FreeBSD+8-current

我不是這裏的專家,但這似乎是將任何非ASCII值放入tar文件頭的唯一官方方式。