- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
总结
我如何在 C++ 中使用 libarchive 编写一个 zip 文件,这样路径名称将被 UTF-8 编码?使用 UTF-8 路径名时,特殊字符将在使用 OS X/Linux/Windows 8/7-Zip/WinZip 时正确解码。
详情
我正在尝试使用 libarchive 编写一个 zip 存档,并在 Windows 上使用 Visual C++ 2013 进行编译。
我希望能够将包含非 ASCII 字符的文件(例如 äöü.txt)添加到 zip 存档中。
libarchive 中设置路径名头的函数有四个:
void archive_entry_set_pathname(struct archive_entry *, const char *);
void archive_entry_copy_pathname(struct archive_entry *, const char *);
void archive_entry_copy_pathname_w(struct archive_entry *, const wchar_t *);
int archive_entry_update_pathname_utf8(struct archive_entry *, const char *);
不幸的是,它们似乎都不起作用。
特别是,我尝试过:
const char* myUtf8Str = ...
archive_entry_update_pathname_utf8(entry, myUtf8Str);
// this sounded like the most straightforward solution
和
const wchar_t* myUtf16Str = ...
archive_entry_copy_pathname_w(entry, myUtf16Str);
// UTF-16 encoded strings seem to be the default on Windows
在这两种情况下,生成的 zip 存档都不会在 Windows 资源管理器和 7-Zip 中正确显示文件名。
我确定我的输入字符串编码正确,因为我将它们从 Qt QString
实例转换而来,这些实例在我的代码的其他部分工作得很好:
const char* myUtf8Str = filename.toUtf8().constData();
const wchar_t* myUtf16Str = filename.toStdWString().c_str();
例如,这甚至适用于在创建 zip 文件时对 libarchive 的另一个调用:
archive_write_open_filename_w(archive, zipFile.toStdWString().c_str());
// creates a zip archive file where the non-ASCII
// chars are encoded correctly, e.g. äöü.zip
我还尝试按照 this example 的建议更改 libarchive 的选项:
archive_write_set_options(a, "hdrcharset=UTF-8");
但是这个调用失败了,所以我假设我必须设置一些其他选项,但是我的想法已经用完了......
更新 2
我已经阅读了更多关于 zip 格式的资料。它允许以 UTF-8 编写文件名,这样 OS X/Linux/Windows 8/7-Zip/WinZip 将始终正确解码它们,参见例如here .
这就是我想使用 libarchive 实现的目标,即我想将我的 UTF-8 编码的 pathname
传递给它,并将其存储在 zip 文件中而不进行任何转换。
我添加了“设置语言环境”方法作为(不令人满意的)答案。
最佳答案
这是一种解决方法,它将使用系统的区域设置存储路径名,即生成的 zip 文件可以在同一系统上正确解码,但不可移植。
这并不令人满意,我发布它只是为了表明它不是我想要的。
将全局区域设置为 ""
作为 explained here :
std::locale::global(std::locale(""));
然后回读:
std::locale loc;
std::cout << loc.name() << std::endl;
// output: English_United States.1252
// may of course be different depending on system settings
然后使用 archive_entry_update_pathname_utf8
设置 pathname
。
zip 文件现在包含使用 Windows-1252 编码的文件名,因此我的 Windows 可以读取它们,但它们在例如Linux.
future
有一个libarchive issue对于 UTF-8 文件名。整个故事相当复杂,但听起来他们可能会在 libarchive 4.0 中添加更好的 UTF-8 支持。
关于c++ - 在 libarchive 中设置 UTF-8 路径名 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27268016/
我已经编写了一个 C 程序来使用 libarchive 从 tar 存档中提取文件。 我想从此存档中提取文件并将其打印到标准输出。 但是我得到了额外的字符 .这是垃圾,但它来自另一个文件(可能与存档中
我正在尝试使用 libarchive 压缩/解压缩文件夹。但是,我不知道如何使用它? 最佳答案 包括这些: #include #include 并编译: gcc -Wall -o test tes
我有一个 tar 文件,我想使用 libarchive 将其提取到特定目录。如何将 libarchive 提取到我想要的任何目录?目前,它总是 提取到我程序的工作目录中。我看了this answer但
任何人都可以帮助展示使用 libarchive 的示例将ZIP文件解压到指定文件夹?看起来提供的示例程序(untar.c、tarfilter.c 和 minitar)都将存档提取到当前工作目录。有没有
我正在尝试使用 libarchive 库重命名存档的条目。特别是我正在使用函数 archive_entry_set_pathname。 文件和空目录被正确重命名,但不幸的是,如果目录不为空,这将不起作
我有一个 C++ 程序,我想从磁盘中读取一些描述的存档。我想以大致类似树的形式重建它以反射(reflect)磁盘上的结构(不支持符号链接(symbolic link)/硬链接(hard link)等时
我尝试修改(在内存中) 中的一个文件 zip 存档。但我不明白该怎么做 我可以将源文件读入内存,但我不明白接下来要做什么 你能举个例子我怎么做吗 最佳答案 为什么,这是一个简单的 C++11 示例,替
我正在尝试将一个目录添加到我正在创建的 tar 存档中。存档已创建,但是其中没有文件。 这是我使用 libarchive 的代码(目录是要压缩的目录路径的 QString。) struct archi
我在使用 libarchive 3.3.2 版时遇到问题。我写了一个程序来读取 7z 文件中的选定条目,它看起来像: file.7z |__ file.xml |__ file.fog
我已经掌握了 libarchive并按照 build instructions 在 Windows 和 Linux 上构建示例. 我现在想在我的基于 Qt 的项目中使用这个库,所以我正在使用 Qt C
我正在尝试以编程方式将 gzip 文件解压缩到内存中,并使用 libarchive project 模拟命令 gzip -d file.gz .该文件实际上取自具有以下 header 的 http 响
我正在使用 iOS-libarchive 库在 iPhone 上提取 .tar。我正在使用此链接中给出的示例代码 http://code.google.com/p/libarchive/wiki/Ex
release notes对于 libarchive 声明,由于 MacOS 中包含旧版本的 libarchive,因此他们建议更改 LD_LIBRARY_PATH 以指向 libarchive 的最
我正在尝试在 Linux 下为 win32 交叉编译一个小程序。它使用 libarchive,它可以在我的 fedora 23 安装上的 mingw 中使用(全部通过 dnf 安装),但我遇到了很多链
我要添加libarchive到我的应用程序,以便能够提取 tar.gz。 正如安装说明所说,我采取了以下步骤: cmake -G "Xcode"~/libarchive-download-dir/ 制
我一定是遗漏了一些简单的东西。对于我的程序调用的任何 libarchive 函数,我都收到“ undefined symbol :...”。 此外,尝试使用推荐的命令编译示例程序之一: gcc -Wa
我在我的项目中使用 libarchive 已经有一段时间了,它工作得很好,目前我正在动态链接到它,所以在 Windows 上,libarchive.dll 文件必须出现在系统上。我现在想静态链接到库,
我正在尝试让 libarchive 模块在 Windows 上的 python 3.4 中工作。我已经用 pip 安装了 libarchive-c,一切正常,但每当我尝试将它导入我的代码或什至单独运行
总结 我如何在 C++ 中使用 libarchive 编写一个 zip 文件,这样路径名称将被 UTF-8 编码?使用 UTF-8 路径名时,特殊字符将在使用 OS X/Linux/Windows 8
我正在使用 macOS Big Sur 并尝试安装 Raku 模块,例如 pakku add App::RaCoCo .我会收到一条消息: Cannot locate native library '
我是一名优秀的程序员,十分优秀!