title: C / C++ UTF-8 upper/lower case conversions
body: <p>The Problem:
  There is a method with a corresponding test-case that works on one machine and fails on the other (details below). I assume there's something wrong with the code, causing it to work by chance on the one machine. Unfortunately I cannot find the problem.</p>
  
  <p>Please note that the usage of std::string and utf-8 encoding are requirements I have no real influence on. Using C++ methods would be totally fine, but unfortunately I failed to find anything. Hence the use of C-functions.</p>
  
  <p>The method:</p>
  
  <pre><code>std::string firstCharToUpperUtf8(const string&amp; orig) {
    std::string retVal;
    retVal.reserve(orig.size());
    std::mbstate_t state = std::mbstate_t();
    char buf[MB_CUR_MAX + 1];
    size_t i = 0;
    if (orig.size() &gt; 0) {
      if (orig[i] &gt; 0) {
        retVal += toupper(orig[i]);
        ++i;
      } else {
        wchar_t wChar;
        int len = mbrtowc(&amp;wChar, &amp;orig[i], MB_CUR_MAX, &amp;state);
        // If this assertion fails, there is an invalid multi-byte character.
        // However, this usually means that the locale is not utf8.
        // Note that the default locale is always C. Main classes need to set them
        // To utf8, even if the system's default is utf8 already.
        assert(len &gt; 0 &amp;&amp; len &lt;= static_cast&lt;int&gt;(MB_CUR_MAX));
        i += len;
        int ret = wcrtomb(buf, towupper(wChar), &amp;state);
        assert(ret &gt; 0 &amp;&amp; ret &lt;= static_cast&lt;int&gt;(MB_CUR_MAX));
        buf[ret] = 0;
        retVal += buf;
      }
    }
    for (; i &lt; orig.size(); ++i) {
      retVal += orig[i];
    }
    return retVal;
  }
  </code></pre>
  
  <p>The test:</p>
  
  <pre><code>TEST(StringUtilsTest, firstCharToUpperUtf8) {
    setlocale(LC_CTYPE, "en_US.utf8");
    ASSERT_EQ("Foo", firstCharToUpperUtf8("foo"));
    ASSERT_EQ("Foo", firstCharToUpperUtf8("Foo"));
    ASSERT_EQ("#foo", firstCharToUpperUtf8("#foo"));
    ASSERT_EQ("ßfoo", firstCharToUpperUtf8("ßfoo"));
    ASSERT_EQ("Éfoo", firstCharToUpperUtf8("éfoo"));
    ASSERT_EQ("Éfoo", firstCharToUpperUtf8("Éfoo"));
  }
  </code></pre>
  
  <p>The failed test (only happens on one of two machines):</p>
  
  <pre><code>Failure
  Value of: firstCharToUpperUtf8("ßfoo")
    Actual: "\xE1\xBA\x9E" "foo"
  Expected: "ßfoo"
  </code></pre>
  
  <p>Both machine have the locale en_US.utf8 installed. They however use different versions of libc. It works on the machine with GLIBC_2.14 independent of where it was compiled and doesn't work on the other machine, while it can only be compiled there, because otherwise it lacks the proper libc version.</p>
  
  <p>Either way, there is a machine that compiles this code and runs it while it fails. There has to be something wrong with the code and I wonder what. Pointing to C++ methods (STL in particular), would also be great. Boost and other libraries should be avoided due to other outside requirements.</p>