diff options
Diffstat (limited to 'src/libs/7zip/unix/CPP/Common/StringConvert.cpp')
-rw-r--r-- | src/libs/7zip/unix/CPP/Common/StringConvert.cpp | 68 |
1 files changed, 52 insertions, 16 deletions
diff --git a/src/libs/7zip/unix/CPP/Common/StringConvert.cpp b/src/libs/7zip/unix/CPP/Common/StringConvert.cpp index dc7dc2669..78f3d90ef 100644 --- a/src/libs/7zip/unix/CPP/Common/StringConvert.cpp +++ b/src/libs/7zip/unix/CPP/Common/StringConvert.cpp @@ -1,7 +1,6 @@ // Common/StringConvert.cpp #include "StdAfx.h" -#include <stdlib.h> #include "StringConvert.h" extern "C" @@ -9,7 +8,6 @@ extern "C" int global_use_utf16_conversion = 0; } - #ifdef LOCALE_IS_UTF8 #ifdef __APPLE_CC__ @@ -34,20 +32,20 @@ UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) CFMutableStringRef cfpath2 = CFStringCreateMutableCopy(NULL,0,cfpath); CFRelease(cfpath); CFStringNormalize(cfpath2,kCFStringNormalizationFormC); - + size_t n = CFStringGetLength(cfpath2); for(size_t i = 0 ; i< n ;i++) { resultString += CFStringGetCharacterAtIndex(cfpath2,i); } - CFRelease(cfpath2); + CFRelease(cfpath2); return resultString; } } UString resultString; - for (int i = 0; i < srcString.Length(); i++) + for (int i = 0; i < srcString.Len(); i++) resultString += wchar_t(srcString[i] & 255); return resultString; @@ -72,16 +70,16 @@ AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) CFMutableStringRef cfpath2 = CFStringCreateMutableCopy(NULL,0,cfpath); CFRelease(cfpath); CFStringNormalize(cfpath2,kCFStringNormalizationFormD); - + CFStringGetCString(cfpath2,(char *)utf8,4096,kCFStringEncodingUTF8); - CFRelease(cfpath2); + CFRelease(cfpath2); return AString(utf8); } AString resultString; - for (int i = 0; i < srcString.Length(); i++) + for (int i = 0; i < srcString.Len(); i++) { if (srcString[i] >= 256) resultString += '?'; else resultString += char(srcString[i]); @@ -104,7 +102,7 @@ UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) } UString resultString; - for (int i = 0; i < srcString.Length(); i++) + for (int i = 0; i < srcString.Len(); i++) resultString += wchar_t(srcString[i] & 255); return resultString; @@ -120,7 +118,7 @@ AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) } AString resultString; - for (int i = 0; i < srcString.Length(); i++) + for (int i = 0; i < srcString.Len(); i++) { if (srcString[i] >= 256) resultString += '?'; else resultString += char(srcString[i]); @@ -138,28 +136,55 @@ UString MultiByteToUnicodeString(const AString &srcString, UINT /* codePage */ ) if ((global_use_utf16_conversion) && (!srcString.IsEmpty())) { UString resultString; - int numChars = mbstowcs(resultString.GetBuffer(srcString.Length()),srcString,srcString.Length()+1); + int numChars = mbstowcs(resultString.GetBuffer(srcString.Len()),srcString,srcString.Len()+1); if (numChars >= 0) { - resultString.ReleaseBuffer(numChars); + resultString.ReleaseBuffer(numChars); + +#if WCHAR_MAX > 0xffff + for (int i = numChars; i >= 0; i--) { + if (resultString[i] > 0xffff) { + wchar_t c = resultString[i] - 0x10000; + resultString.Delete(i); + resultString.Insert(i, ((c >> 10) & 0x3ff) + 0xd800); + resultString.Insert(i + 1, (c & 0x3ff) + 0xdc00); + numChars++; + } + } +#endif + return resultString; } } #endif UString resultString; - for (int i = 0; i < srcString.Length(); i++) + for (int i = 0; i < srcString.Len(); i++) resultString += wchar_t(srcString[i] & 255); return resultString; } -AString UnicodeStringToMultiByte(const UString &srcString, UINT /* codePage */ ) +AString UnicodeStringToMultiByte(const UString &src, UINT /* codePage */ ) { #ifdef ENV_HAVE_WCSTOMBS +#if WCHAR_MAX > 0xffff + UString srcString(src); + for (int i = 0; i < srcString.Len(); i++) { + if ((0xd800 <= srcString[i] && srcString[i] <= 0xdbff) && ((i + 1) < srcString.Len()) && + (0xdc00 <= srcString[i + 1] && srcString[i + 1] <= 0xdf00)) { + wchar_t c = (((srcString[i] - 0xd800) << 10) | (srcString[i + 1] - 0xdc00)) + 0x10000; + srcString.Delete(i, 2); + srcString.Insert(i, c); + } + } +#else + UString &srcString = src; +#endif + if ((global_use_utf16_conversion) && (!srcString.IsEmpty())) { AString resultString; - int numRequiredBytes = srcString.Length() * 6+1; + int numRequiredBytes = srcString.Len() * 6+1; int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes),srcString,numRequiredBytes); if (numChars >= 0) { resultString.ReleaseBuffer(numChars); @@ -169,7 +194,7 @@ AString UnicodeStringToMultiByte(const UString &srcString, UINT /* codePage */ ) #endif AString resultString; - for (int i = 0; i < srcString.Length(); i++) + for (int i = 0; i < srcString.Len(); i++) { if (srcString[i] >= 256) resultString += '?'; else resultString += char(srcString[i]); @@ -179,3 +204,14 @@ AString UnicodeStringToMultiByte(const UString &srcString, UINT /* codePage */ ) #endif /* LOCALE_IS_UTF8 */ + +void MultiByteToUnicodeString2(UString &dest, const AString &srcString, UINT codePage) +{ + dest = MultiByteToUnicodeString(srcString,codePage); +} + +void UnicodeStringToMultiByte2(AString &dest, const UString &srcString, UINT codePage) +{ + dest = UnicodeStringToMultiByte(srcString,codePage); +} + |