From 1ca6396a3dd284241de11bcaa210ad5836e8e5a8 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 8 Dec 2009 16:18:01 +0200 Subject: Multiple object model character encodings support Also add support for ISO-8859-1. --- libxsd/xsd/cxx/xml/string.ixx | 88 +++++++++---------------------------------- 1 file changed, 17 insertions(+), 71 deletions(-) (limited to 'libxsd/xsd/cxx/xml/string.ixx') diff --git a/libxsd/xsd/cxx/xml/string.ixx b/libxsd/xsd/cxx/xml/string.ixx index bde86d8..056a15f 100644 --- a/libxsd/xsd/cxx/xml/string.ixx +++ b/libxsd/xsd/cxx/xml/string.ixx @@ -6,11 +6,13 @@ #ifndef XSD_CXX_XML_STRING_IXX #define XSD_CXX_XML_STRING_IXX -#include -#include // std::memcpy - #include -#include + +// If no transcoder has been included, use the default UTF-8. +// +#ifndef XSD_CXX_XML_TRANSCODER +# include +#endif // We sometimes need this functionality even if we are building for // wchar_t. @@ -21,43 +23,17 @@ namespace xsd { namespace xml { -#ifndef XSD_USE_LCP - namespace bits - { - // UTF-16 to/from UTF-8 transcoder. - // - template - struct char_transcoder - { - static std::basic_string - to (const XMLCh* s, std::size_t length); - - static XMLCh* - from (const C* s, std::size_t length); - - private: - static const unsigned char first_byte_mask_[5]; - }; - } -#endif - template <> inline std::basic_string transcode (const XMLCh* s) { - if (s == 0) + if (s == 0 || *s == XMLCh (0)) return std::basic_string (); -#ifndef XSD_USE_LCP - return bits::char_transcoder::to ( - s, xercesc::XMLString::stringLen (s)); +#ifndef XSD_CXX_XML_TRANSCODER_CHAR_LCP + return char_transcoder::to (s, xercesc::XMLString::stringLen (s)); #else - // Use Xerces-C++ local code page transcoding. - // - std_memory_manager mm; - auto_array r ( - xercesc::XMLString::transcode (s, &mm), mm); - return std::basic_string (r.get ()); + return char_transcoder::to (s); #endif } @@ -68,41 +44,17 @@ namespace xsd if (s == 0 || len == 0) return std::basic_string (); -#ifndef XSD_USE_LCP - // Convert UTF-16 to UTF-8 - // - return bits::char_transcoder::to (s, len); -#else - // Use Xerces-C++ local code page transcoding. - // - auto_array tmp (new XMLCh[len + 1]); - std::memcpy (tmp.get (), s, len * sizeof (XMLCh)); - tmp[len] = XMLCh (0); - - std_memory_manager mm; - auto_array r ( - xercesc::XMLString::transcode (tmp.get (), &mm), mm); - - tmp.reset (); - - return std::basic_string (r.get ()); -#endif + return char_transcoder::to (s, len); } template <> inline XMLCh* transcode_to_xmlch (const char* s) { -#ifndef XSD_USE_LCP - // Convert UTF-8 to UTF-16 - // - return bits::char_transcoder::from ( - s, std::char_traits::length (s)); +#ifndef XSD_CXX_XML_TRANSCODER_CHAR_LCP + return char_transcoder::from (s, std::char_traits::length (s)); #else - // Use Xerces-C++ local code page transcoding. - // - std_memory_manager mm; - return xercesc::XMLString::transcode (s, &mm); + return char_transcoder::from (s); #endif } @@ -110,16 +62,10 @@ namespace xsd inline XMLCh* transcode_to_xmlch (const std::basic_string& s) { -#ifndef XSD_USE_LCP - // Convert UTF-8 to UTF-16 - // - return bits::char_transcoder::from ( - s.c_str (), s.length ()); +#ifndef XSD_CXX_XML_TRANSCODER_CHAR_LCP + return char_transcoder::from (s.c_str (), s.length ()); #else - // Use Xerces-C++ local code page transcoding. - // - std_memory_manager mm; - return xercesc::XMLString::transcode (s.c_str (), &mm); + return char_transcoder::from (s.c_str ()); #endif } } -- cgit v1.1