1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/other-licenses/7zstub/src/Common/UTFConvert.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,91 @@ 1.4 +// UTFConvert.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#include "UTFConvert.h" 1.9 +#include "Types.h" 1.10 + 1.11 +static Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; 1.12 + 1.13 +// These functions are for UTF8 <-> UTF16 conversion. 1.14 + 1.15 +bool ConvertUTF8ToUnicode(const AString &src, UString &dest) 1.16 +{ 1.17 + dest.Empty(); 1.18 + for(int i = 0; i < src.Length();) 1.19 + { 1.20 + Byte c = (Byte)src[i++]; 1.21 + if (c < 0x80) 1.22 + { 1.23 + dest += (wchar_t)c; 1.24 + continue; 1.25 + } 1.26 + if(c < 0xC0) 1.27 + return false; 1.28 + int numAdds; 1.29 + for (numAdds = 1; numAdds < 5; numAdds++) 1.30 + if (c < kUtf8Limits[numAdds]) 1.31 + break; 1.32 + UInt32 value = (c - kUtf8Limits[numAdds - 1]); 1.33 + do 1.34 + { 1.35 + if (i >= src.Length()) 1.36 + return false; 1.37 + Byte c2 = (Byte)src[i++]; 1.38 + if (c2 < 0x80 || c2 >= 0xC0) 1.39 + return false; 1.40 + value <<= 6; 1.41 + value |= (c2 - 0x80); 1.42 + numAdds--; 1.43 + } 1.44 + while(numAdds > 0); 1.45 + if (value < 0x10000) 1.46 + dest += (wchar_t)(value); 1.47 + else 1.48 + { 1.49 + value -= 0x10000; 1.50 + if (value >= 0x100000) 1.51 + return false; 1.52 + dest += (wchar_t)(0xD800 + (value >> 10)); 1.53 + dest += (wchar_t)(0xDC00 + (value & 0x3FF)); 1.54 + } 1.55 + } 1.56 + return true; 1.57 +} 1.58 + 1.59 +bool ConvertUnicodeToUTF8(const UString &src, AString &dest) 1.60 +{ 1.61 + dest.Empty(); 1.62 + for(int i = 0; i < src.Length();) 1.63 + { 1.64 + UInt32 value = (UInt32)src[i++]; 1.65 + if (value < 0x80) 1.66 + { 1.67 + dest += (char)value; 1.68 + continue; 1.69 + } 1.70 + if (value >= 0xD800 && value < 0xE000) 1.71 + { 1.72 + if (value >= 0xDC00) 1.73 + return false; 1.74 + if (i >= src.Length()) 1.75 + return false; 1.76 + UInt32 c2 = (UInt32)src[i++]; 1.77 + if (c2 < 0xDC00 || c2 >= 0xE000) 1.78 + return false; 1.79 + value = ((value - 0xD800) << 10) | (c2 - 0xDC00); 1.80 + } 1.81 + int numAdds; 1.82 + for (numAdds = 1; numAdds < 5; numAdds++) 1.83 + if (value < (((UInt32)1) << (numAdds * 5 + 6))) 1.84 + break; 1.85 + dest += (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds))); 1.86 + do 1.87 + { 1.88 + numAdds--; 1.89 + dest += (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F)); 1.90 + } 1.91 + while(numAdds > 0); 1.92 + } 1.93 + return true; 1.94 +}