]> git.mxchange.org Git - simgear.git/commitdiff
Implement UTF-8 to Latin1 converter
authorClément de l'Hamaide <clemaez@hotmail.fr>
Sun, 1 Dec 2013 17:47:49 +0000 (18:47 +0100)
committerClément de l'Hamaide <clemaez@hotmail.fr>
Sun, 1 Dec 2013 17:48:05 +0000 (18:48 +0100)
simgear/misc/strutils.cxx
simgear/misc/strutils.hxx

index 52a8d619c72e50f794fd7a15721e327eeb08c855..25480271069b75128d4f4261faadf3e37fb9255b 100644 (file)
@@ -35,6 +35,39 @@ using std::stringstream;
 namespace simgear {
     namespace strutils {
 
+       /*
+        * utf8ToLatin1() convert utf8 to latin, useful for accent character (i.e éâàîè...)
+        */
+       template <typename Iterator> size_t get_length (Iterator p) {
+               unsigned char c = static_cast<unsigned char> (*p);
+               if (c < 0x80) return 1;
+               else if (!(c & 0x20)) return 2;
+               else if (!(c & 0x10)) return 3;
+               else if (!(c & 0x08)) return 4;
+               else if (!(c & 0x04)) return 5;
+               else return 6;
+       }
+
+       typedef unsigned int value_type;
+       template <typename Iterator> value_type get_value (Iterator p) {
+               size_t len = get_length (p);
+               if (len == 1) return *p;
+               value_type res = static_cast<unsigned char> ( *p & (0xff >> (len + 1))) << ((len - 1) * 6 );
+               for (--len; len; --len)
+                       res |= (static_cast<unsigned char> (*(++p)) - 0x80) << ((len - 1) * 6);
+               return res;
+       }
+
+       string utf8ToLatin1( string& s_utf8 ) {
+               string s_latin1;
+               for (string::iterator p = s_utf8.begin(); p != s_utf8.end(); ++p) {
+                       value_type value = get_value<string::iterator&>(p);
+                       if (value > 0xff) SG_LOG(SG_IO, SG_WARN, "utf8ToLatin1: wrong char value: " << value);
+                       s_latin1 += static_cast<char>(value);
+               }
+               return s_latin1;
+       }
+
        /**
         * 
         */
index 47f69bac4ae43b90e720d3df01a68cba67a97364..9070b246cb0ad3b6bf83ef9c3562632d87553664 100644 (file)
@@ -38,6 +38,11 @@ typedef std::vector < std::string > string_list;
 namespace simgear {
   namespace strutils {
 
+       /**
+        * utf8ToLatin1() convert utf8 to latin, useful for accent character (i.e éâàîè...)
+        */
+       std::string utf8ToLatin1( std::string & s_utf8 );
+
 //     /** 
 //      * atof() wrapper for "string" type
 //      */