You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.9 KiB
105 lines
2.9 KiB
1 year ago
|
From 0bb3986583a1daff2466c318473191d6cbd63adb Mon Sep 17 00:00:00 2001
|
||
|
From: Sergey Cherevko <s.cherevko@msvsphere-os.ru>
|
||
|
Date: Fri, 19 Jan 2024 16:35:06 +0300
|
||
|
Subject: [PATCH] Using libnatspec to correctly decode non-ASCII filenames
|
||
|
zipped on Windows.
|
||
|
|
||
|
---
|
||
|
CPP/7zip/Archive/Zip/ZipItem.cpp | 44 +++++++-------------------------
|
||
|
makefile.linux_amd64_asm | 2 +-
|
||
|
makefile.machine | 2 +-
|
||
|
3 files changed, 11 insertions(+), 37 deletions(-)
|
||
|
|
||
|
diff --git a/CPP/7zip/Archive/Zip/ZipItem.cpp b/CPP/7zip/Archive/Zip/ZipItem.cpp
|
||
|
index 12bc8ad..16a4dbe 100644
|
||
|
--- a/CPP/7zip/Archive/Zip/ZipItem.cpp
|
||
|
+++ b/CPP/7zip/Archive/Zip/ZipItem.cpp
|
||
|
@@ -1,5 +1,5 @@
|
||
|
// Archive/ZipItem.cpp
|
||
|
-
|
||
|
+#include <natspec.h>
|
||
|
#include "StdAfx.h"
|
||
|
|
||
|
#include "../../../../C/CpuArch.h"
|
||
|
@@ -208,43 +208,17 @@ void CItem::GetUnicodeString(UString &res, const AString &s, bool isComment, boo
|
||
|
bool isUtf8 = IsUtf8();
|
||
|
bool ignore_Utf8_Errors = true;
|
||
|
|
||
|
- if (!isUtf8)
|
||
|
- {
|
||
|
- {
|
||
|
- const unsigned id = isComment ?
|
||
|
- NFileHeader::NExtraID::kIzUnicodeComment:
|
||
|
- NFileHeader::NExtraID::kIzUnicodeName;
|
||
|
- const CObjectVector<CExtraSubBlock> &subBlocks = GetMainExtra().SubBlocks;
|
||
|
-
|
||
|
- FOR_VECTOR (i, subBlocks)
|
||
|
- {
|
||
|
- const CExtraSubBlock &sb = subBlocks[i];
|
||
|
- if (sb.ID == id)
|
||
|
- {
|
||
|
- AString utf;
|
||
|
- if (sb.ExtractIzUnicode(CrcCalc(s, s.Len()), utf))
|
||
|
- if (ConvertUTF8ToUnicode(utf, res))
|
||
|
- return;
|
||
|
- break;
|
||
|
- }
|
||
|
- }
|
||
|
- }
|
||
|
-
|
||
|
- if (useSpecifiedCodePage)
|
||
|
- isUtf8 = (codePage == CP_UTF8);
|
||
|
- #ifdef _WIN32
|
||
|
- else if (GetHostOS() == NFileHeader::NHostOS::kUnix)
|
||
|
- {
|
||
|
- /* Some ZIP archives in Unix use UTF-8 encoding without Utf8 flag in header.
|
||
|
- We try to get name as UTF-8.
|
||
|
- Do we need to do it in POSIX version also? */
|
||
|
- isUtf8 = true;
|
||
|
- ignore_Utf8_Errors = false;
|
||
|
- }
|
||
|
- #endif
|
||
|
+ if (!isUtf8) {
|
||
|
+ const char *oem_charset = natspec_get_charset_by_locale(NATSPEC_DOSCS, "");
|
||
|
+ char *p = natspec_convert(s.Ptr(), NULL, oem_charset, 0);
|
||
|
+ AString utf = p;
|
||
|
+ free(p);
|
||
|
+ if (ConvertUTF8ToUnicode(utf, res))
|
||
|
+ return;
|
||
|
}
|
||
|
|
||
|
|
||
|
+
|
||
|
if (isUtf8)
|
||
|
if (ConvertUTF8ToUnicode(s, res) || ignore_Utf8_Errors)
|
||
|
return;
|
||
|
diff --git a/makefile.linux_amd64_asm b/makefile.linux_amd64_asm
|
||
|
index 075c6a8..3de8ccf 100644
|
||
|
--- a/makefile.linux_amd64_asm
|
||
|
+++ b/makefile.linux_amd64_asm
|
||
|
@@ -19,7 +19,7 @@ ASM=yasm -f elf -m amd64 -Dx64
|
||
|
|
||
|
PRE_COMPILED_HEADER=StdAfx.h.gch
|
||
|
|
||
|
-LOCAL_LIBS=-lpthread
|
||
|
+LOCAL_LIBS=-lpthread -lnatspec
|
||
|
LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl
|
||
|
|
||
|
CPU=x64
|
||
|
diff --git a/makefile.machine b/makefile.machine
|
||
|
index 9e34c34..054edde 100644
|
||
|
--- a/makefile.machine
|
||
|
+++ b/makefile.machine
|
||
|
@@ -15,7 +15,7 @@ CC=gcc
|
||
|
CC_SHARED=-fPIC
|
||
|
LINK_SHARED=-fPIC -shared
|
||
|
|
||
|
-LOCAL_LIBS=-lpthread
|
||
|
+LOCAL_LIBS=-lpthread -lnatspec
|
||
|
LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl
|
||
|
|
||
|
OBJ_CRC32=$(OBJ_CRC32_C)
|
||
|
--
|
||
|
2.39.3
|
||
|
|