diff options
author | Bernard Normier <bernard@zeroc.com> | 2008-04-18 17:58:23 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2008-04-18 17:58:23 -0400 |
commit | cb11f5d824675f9b5aa4e24aef5b0b15daa66385 (patch) | |
tree | f2e8582394a2524dd08910c5eb7812d28ed78f0d | |
parent | Merge branch 'master' of cvs:/home/git/ice (diff) | |
download | ice-cb11f5d824675f9b5aa4e24aef5b0b15daa66385.tar.bz2 ice-cb11f5d824675f9b5aa4e24aef5b0b15daa66385.tar.xz ice-cb11f5d824675f9b5aa4e24aef5b0b15daa66385.zip |
Fixed bug #2992
-rw-r--r-- | cpp/include/Ice/StringConverter.h | 6 | ||||
-rw-r--r-- | cpp/include/IceUtil/Unicode.h | 51 | ||||
-rw-r--r-- | cpp/src/Ice/StringConverter.cpp | 9 | ||||
-rw-r--r-- | cpp/src/IceUtil/ConvertUTF.h | 8 | ||||
-rw-r--r-- | cpp/src/IceUtil/Unicode.cpp | 24 |
5 files changed, 54 insertions, 44 deletions
diff --git a/cpp/include/Ice/StringConverter.h b/cpp/include/Ice/StringConverter.h index de35ba731f1..4d87a9ef7b7 100644 --- a/cpp/include/Ice/StringConverter.h +++ b/cpp/include/Ice/StringConverter.h @@ -14,6 +14,7 @@ #include <IceUtil/Exception.h> #include <IceUtil/Shared.h> #include <IceUtil/Handle.h> +#include <IceUtil/Unicode.h> #include <string> @@ -70,9 +71,14 @@ class ICE_API UnicodeWstringConverter : public WstringConverter { public: + UnicodeWstringConverter(IceUtil::ConversionFlags = IceUtil::lenientConversion); + virtual Byte* toUTF8(const wchar_t*, const wchar_t*, UTF8Buffer&) const; virtual void fromUTF8(const Byte*, const Byte*, std::wstring&) const; + +private: + const IceUtil::ConversionFlags _conversionFlags; }; #ifdef _WIN32 diff --git a/cpp/include/IceUtil/Unicode.h b/cpp/include/IceUtil/Unicode.h index 3eaa154021c..2df19ade7e8 100644 --- a/cpp/include/IceUtil/Unicode.h +++ b/cpp/include/IceUtil/Unicode.h @@ -16,6 +16,12 @@ namespace IceUtil { +enum ConversionFlags +{ + strictConversion = 0, + lenientConversion +}; + #if defined(_MSC_VER) && (_MSC_VER >= 1300) // @@ -32,54 +38,54 @@ namespace IceUtil // # if defined(_NATIVE_WCHAR_T_DEFINED) -ICE_UTIL_API std::string wstringToString(const std::wstring&); +ICE_UTIL_API std::string wstringToString(const std::wstring&, ConversionFlags = lenientConversion); # if _MSC_VER >= 1400 // // Building or using with VC8 // -ICE_UTIL_API std::wstring stringToWstring(const std::string&); -ICE_UTIL_API std::string wstringToString(const std::basic_string<unsigned short>&); -ICE_UTIL_API std::basic_string<unsigned short> stringToTypedefWstring(const std::string&); +ICE_UTIL_API std::wstring stringToWstring(const std::string&, ConversionFlags = lenientConversion); +ICE_UTIL_API std::string wstringToString(const std::basic_string<unsigned short>&, ConversionFlags = lenientConversion); +ICE_UTIL_API std::basic_string<unsigned short> stringToTypedefWstring(const std::string&, ConversionFlags = lenientConversion); # else // // Using a VC7.x build with the non-default /Zc // -ICE_UTIL_API std::wstring stringToNativeWstring(const std::string&); +ICE_UTIL_API std::wstring stringToNativeWstring(const std::string&, ConversionFlags = lenientConversion); inline std::wstring -stringToWstring(const std::string& str) +stringToWstring(const std::string& str, ConversionFlags flags = lenientConversion) { - return stringToNativeWstring(str); + return stringToNativeWstring(str, flags); } # endif # else -ICE_UTIL_API std::string wstringToString(const std::wstring&); +ICE_UTIL_API std::string wstringToString(const std::wstring&, ConversionFlags = lenientConversion); # if _MSC_VER < 1400 // // Building or using with VC7.x // -ICE_UTIL_API std::wstring stringToWstring(const std::string&); -ICE_UTIL_API std::string wstringToString(const std::basic_string<__wchar_t>&); -ICE_UTIL_API std::basic_string<__wchar_t> stringToNativeWstring(const std::string&); +ICE_UTIL_API std::wstring stringToWstring(const std::string&, ConversionFlags = lenientConversion); +ICE_UTIL_API std::string wstringToString(const std::basic_string<__wchar_t>&, ConversionFlags = lenientConversion); +ICE_UTIL_API std::basic_string<__wchar_t> stringToNativeWstring(const std::string&, ConversionFlags = lenientConversion); # else // // Using a VC8.x build the non-default /Zc // -ICE_UTIL_API std::wstring stringToTypedefWstring(const std::string&); +ICE_UTIL_API std::wstring stringToTypedefWstring(const std::string&, ConversionFlags = lenientConversion); inline std::wstring -stringToWstring(const std::string& str) +stringToWstring(const std::string& str, ConversionFlags flags = lenientConversion) { - return stringToTypedefWstring(str); + return stringToTypedefWstring(str, flags); } # endif # endif #else -ICE_UTIL_API std::string wstringToString(const std::wstring&); -ICE_UTIL_API std::wstring stringToWstring(const std::string&); +ICE_UTIL_API std::string wstringToString(const std::wstring&, ConversionFlags = lenientConversion); +ICE_UTIL_API std::wstring stringToWstring(const std::string&, ConversionFlags = lenientConversion); #endif @@ -128,13 +134,6 @@ namespace IceUtilInternal // unicode.org // - -enum ConversionFlags -{ - strictConversion = 0, - lenientConversion -}; - enum ConversionResult { conversionOK, /* conversion successful */ @@ -145,15 +144,15 @@ enum ConversionResult ICE_UTIL_API ConversionResult convertUTFWstringToUTF8(const wchar_t*& sourceStart, const wchar_t* sourceEnd, - IceUtil::Byte*& targetStart, IceUtil::Byte* targetEnd, ConversionFlags flags); + IceUtil::Byte*& targetStart, IceUtil::Byte* targetEnd, IceUtil::ConversionFlags flags); ICE_UTIL_API ConversionResult convertUTF8ToUTFWstring(const IceUtil::Byte*& sourceStart, const IceUtil::Byte* sourceEnd, - wchar_t*& targetStart, wchar_t* targetEnd, ConversionFlags flags); + wchar_t*& targetStart, wchar_t* targetEnd, IceUtil::ConversionFlags flags); ICE_UTIL_API ConversionResult convertUTF8ToUTFWstring(const IceUtil::Byte*& sourceStart, const IceUtil::Byte* sourceEnd, - std::wstring& target, ConversionFlags flags); + std::wstring& target, IceUtil::ConversionFlags flags); } diff --git a/cpp/src/Ice/StringConverter.cpp b/cpp/src/Ice/StringConverter.cpp index 1e750a88e1d..e9b6068b9ba 100644 --- a/cpp/src/Ice/StringConverter.cpp +++ b/cpp/src/Ice/StringConverter.cpp @@ -20,6 +20,11 @@ using namespace std; namespace Ice { +UnicodeWstringConverter::UnicodeWstringConverter(ConversionFlags flags) : + _conversionFlags(flags) +{ +} + Byte* UnicodeWstringConverter::toUTF8(const wchar_t* sourceStart, const wchar_t* sourceEnd, @@ -38,7 +43,7 @@ UnicodeWstringConverter::toUTF8(const wchar_t* sourceStart, while((result = convertUTFWstringToUTF8(sourceStart, sourceEnd, - targetStart, targetEnd, lenientConversion)) + targetStart, targetEnd, _conversionFlags)) == targetExhausted) { targetStart = buffer.getMoreBytes(chunkSize, targetStart); @@ -74,7 +79,7 @@ UnicodeWstringConverter::fromUTF8(const Byte* sourceStart, const Byte* sourceEnd } ConversionResult result = - convertUTF8ToUTFWstring(sourceStart, sourceEnd, target, lenientConversion); + convertUTF8ToUTFWstring(sourceStart, sourceEnd, target, _conversionFlags); switch(result) { diff --git a/cpp/src/IceUtil/ConvertUTF.h b/cpp/src/IceUtil/ConvertUTF.h index 40973ac0e84..89c047b84ee 100644 --- a/cpp/src/IceUtil/ConvertUTF.h +++ b/cpp/src/IceUtil/ConvertUTF.h @@ -120,19 +120,19 @@ typedef bool Boolean; /* 0 or 1 */ ConversionResult ConvertUTF8toUTF16( const UTF8** sourceStart, const UTF8* sourceEnd, - UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + UTF16** targetStart, UTF16* targetEnd, IceUtil::ConversionFlags flags); ConversionResult ConvertUTF16toUTF8 ( const UTF16** sourceStart, const UTF16* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + UTF8** targetStart, UTF8* targetEnd, IceUtil::ConversionFlags flags); ConversionResult ConvertUTF8toUTF32( const UTF8** sourceStart, const UTF8* sourceEnd, - UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + UTF32** targetStart, UTF32* targetEnd, IceUtil::ConversionFlags flags); ConversionResult ConvertUTF32toUTF8( const UTF32** sourceStart, const UTF32* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + UTF8** targetStart, UTF8* targetEnd, IceUtil::ConversionFlags flags); // // isLegalUTFSequence is declared in IceUtil/Unicode.h diff --git a/cpp/src/IceUtil/Unicode.cpp b/cpp/src/IceUtil/Unicode.cpp index 226259bd21d..8476ece1afd 100644 --- a/cpp/src/IceUtil/Unicode.cpp +++ b/cpp/src/IceUtil/Unicode.cpp @@ -185,7 +185,7 @@ IceUtil::UTFConversionException::conversionError() const string -IceUtil::wstringToString(const wstring& wstr) +IceUtil::wstringToString(const wstring& wstr, ConversionFlags flags) { string target; @@ -200,7 +200,7 @@ IceUtil::wstringToString(const wstring& wstr) ConversionResult cr = convertUTFWstringToUTF8( sourceStart, sourceStart + wstr.size(), - targetStart, targetEnd, lenientConversion); + targetStart, targetEnd, flags); if(cr != conversionOK) { @@ -218,14 +218,14 @@ IceUtil::wstringToString(const wstring& wstr) } wstring -IceUtil::stringToWstring(const string& str) +IceUtil::stringToWstring(const string& str, ConversionFlags flags) { wstring result; const Byte* sourceStart = reinterpret_cast<const Byte*>(str.data()); ConversionResult cr = convertUTF8ToUTFWstring(sourceStart, sourceStart + str.size(), - result, lenientConversion); + result, flags); if(cr != conversionOK) { @@ -245,27 +245,27 @@ IceUtil::stringToWstring(const string& str) # if _MSC_VER < 1400 string -IceUtil::wstringToString(const basic_string<__wchar_t>& str) +IceUtil::wstringToString(const basic_string<__wchar_t>& str, ConversionFlags flags) { - return wstringToString(*reinterpret_cast<const wstring*>(&str)); + return wstringToString(*reinterpret_cast<const wstring*>(&str), flags); } basic_string<__wchar_t> -IceUtil::stringToNativeWstring(const string& str) +IceUtil::stringToNativeWstring(const string& str, ConversionFlags flags) { - return reinterpret_cast<basic_string<__wchar_t>& >(stringToWstring(str)); + return reinterpret_cast<basic_string<__wchar_t>& >(stringToWstring(str, flags)); } # else string -IceUtil::wstringToString(const basic_string<unsigned short>& str) +IceUtil::wstringToString(const basic_string<unsigned short>& str, ConversionFlags flags) { - return wstringToString(*reinterpret_cast<const wstring*>(&str)); + return wstringToString(*reinterpret_cast<const wstring*>(&str), flags); } basic_string<unsigned short> -IceUtil::stringToTypedefWstring(const string& str) +IceUtil::stringToTypedefWstring(const string& str, ConversionFlags flags) { - return reinterpret_cast<basic_string<unsigned short>& >(stringToWstring(str)); + return reinterpret_cast<basic_string<unsigned short>& >(stringToWstring(str, flags)); } # endif |