使用XZIP编码问题

时间:2011-04-13 13:09:42

标签: c++ encoding

我写了一个c ++程序,需要在其工作中压缩文件。为了创建这些zip文件,我使用了XZip库。虽然开发这个程序是在Win7机器上运行的,但它工作正常 现在该程序应该在WindowsXP机器上使用。我遇到的问题是: 如果我让XZip创建zip存档“ü.zip”并在Win7上将文件“ü.txt”添加到它,它按预期工作。但是在WindowsXP上,我最终得到了带有“³.txt”的“ü.zip”文件作为文件。

“³”=> “ü”当然是UTF8和Ascii之间的编码问题(UTF8中的ü= 252和Ascii中的252 =³)但我无法想象这会如何影响内部zip结构的创建,具体取决于操作系统。

//编辑清除它:
问题是我在Win7上使用XZip运行测试并获得包含名为“ü.txt”的文件的“ü.zip”存档。
当我在XP机器上运行该测试时,我得到包含文件“³.txt”的存档“ü.zip”。

// EDIT2: 让我想知道的是,究竟是什么原因导致zip在XP和Win7之间发生变化。它确实发生变化的事实意味着windows函数的行为不同,或者XZip对于内置的不同操作系统具有特定的行为 快速查看XZip时,我看不到它会更改zip存档上的编码标志。当然,这个问题只能由之前仔细研究过这个问题的人来回答。

2 个答案:

答案 0 :(得分:0)

作为一般规则,如果你想在语言环境,操作系统(包括不同的版本)和你拥有的东西之间有任何类型的可移植性,你应该将你的文件名限制为通常的26个字母,10个数字,也许是'_'和' - '(我甚至不确定后者),还有一个'。',最后不超过三个字符。一旦你开始使用原始ASCII字符集之外的字母,你就可以使用解释字符集的各种程序。

此外,252不是ASCII中的任何内容,因为ASCII仅使用0 ... 127范围内的字符代码。在UTF-8中,252将是六字节字符的第一个字节。 Unicode中不存在的东西:在UTF-8中,带有DIAERESIS的LATIN SMALL LETTER U将是双字节序列0xC3,0xBC。 256 是ISO 8859-1中带有DIAERESIS的LATIN SMALL LETTER U的编码,也称为Latin-1;它也是UTF-16和UTF-32的编码。

当然,这些都不会影响文件中的内容。

答案 1 :(得分:0)

可能是您正在以ASCII(而不是UNICODE)构建Win32程序(或库)。如果使用UNICODE配置设置构建Win32应用程序(可以在Visual Studio项目设置中更改它),它可能会有所帮助。

如果没有看到您的代码,就无法说出您的计划中发生了什么。可能是您的库或归档格式不是UNICODE感知的,可能是您的程序的代码不是UNICODE感知的,可能是您不小心处理字符串,或者您可能只需将项目设置更改为UNICODE。如果不使用UNICODE字符串,那么“非Unicode程序的8位编码”Windows操作系统设置也很重要。

至于252,UTF8和ASCII由James Kanze阅读。使用没有':','?','*','/','\'字符的ASCII文件名或多或少都是安全的。如果不使用基于UNICODE的程序和文件系统,则使用非ASCII字符可能会导致编码问题。