<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Dear Tobias,</p>
    <p>My apologies for taking so long to respond to this, but I wanted
      to give a thorough answer.  See the summary at the end if you
      don't care about the details.<br>
    </p>
    <p>So, SWORD has a class StringMgr, which manages strings within
      SWORD, and by default SWORD includes a very basic implementation,
      which doesn't necessarily know about or support anything beyond
      what the basic C string methods support.</p>
    <p>I am sure this invokes a sense of horror from you at first, so
      let me explain a bit how we properly handle character sets. 
      First, short background: since we existed well before the Unicode
      world, we have multiple locale files for each language, which you
      will still see in the locales.d/ folder, each specifying their
      character encoding, and most of the time SWORD doesn't need to
      manipulate characters, so simply holding data, and passing that
      data to a display frontend, and specifying a font which will
      handle that encoding was enough in the old world.  IMPORTANT: the
      one place we do need to manipulate character data is to perform
      case-insensitive comparisons.  We did this in the past by
      converting a string to uppercase before comparison.  You'll notice
      this in the section for Bible book abbreviation in each locale--
      the partial match key must be in a toupper state.</p>
    <p>Today, everything in SWORD prefers Unicode and specifically,
      encoded as UTF-8.  To support this:</p>
    <p>First, we have utility functions within SWORD for working with
      Unicode encoded strings, see:</p>
    <p><a class="moz-txt-link-freetext" href="http://crosswire.org/svn/sword/trunk/include/utilstr.h">http://crosswire.org/svn/sword/trunk/include/utilstr.h</a></p>
    <p>Specifically:<br>
    </p>
    <pre>SWBuf assureValidUTF8(const char *buf);
SW_u32 getUniCharFromUTF8(const unsigned char **buf, bool skipValidation = false);
SWBuf *getUTF8FromUniChar(SW_u32 uchar, SWBuf *appendTo);
SWBuf utf8ToWChar(const char *buf);
SWBuf wcharToUTF8(const wchar_t *buf);


</pre>
    <p>To wrap this up, by subclassing StringMgr, SWORD supports
      implementing character encoding by linking to other libraries,
      e.g., ICU, Qt, etc. to handle full Unicode support.  And while the
      StringMgr interface allow implementation of many string functions,
      upperUTF8 is the only real method the SWORD engine needs to work
      completely.  Some utilities use the other methods in there, but
      the engine, only needs this method.<br>
    </p>
    <p><br>
    </p>
    <p>In summary, on Android, you are likely not linking to ICU when
      you build the native SWORD binary-- which I don't do either for
      Bishop.  The Cordova SWORD plugin uses the SWORD java-jni
      bindings, which use the Java VM to implement StringMgr:</p>
    <p><a class="moz-txt-link-freetext" href="https://crosswire.org/svn/sword/trunk/bindings/java-jni/jni/swordstub.cpp">https://crosswire.org/svn/sword/trunk/bindings/java-jni/jni/swordstub.cpp</a>
      Search for: AndroidStringMgr<br>
    </p>
    <p>And on iOS the Cordova plugin uses the Swift libraries to do the
      same.  This is done by using the SWORD flatapi call to
      org_crosswire_sword_StringMgr_setToUpper to provide a Swift
      implementation to uppercase a string. <br>
    </p>
    <p><a class="moz-txt-link-freetext" href="http://crosswire.org/svn/sword/trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD.swift">http://crosswire.org/svn/sword/trunk/bindings/cordova/cordova-plugin-crosswire-sword/src/ios/SWORD.swift</a></p>
    <p>I hope this give you the information you need to get things
      working for you.  Please don't hesitate to ask if you need help,</p>
    <p>Troy<br>
    </p>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 1/17/21 11:59 AM, Tobias Klein
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:4e4ad4ff-aaea-d8a1-7019-4b5085abb4e3@tklein.info">Dear
      Troy,
      <br>
      <br>
      I'm playing with an Android Build of Sword and I get issues with
      the German Umlauts.
      <br>
      <br>
      So I have issues with Bible book names like Römer, Könige, etc.
      <br>
      <br>
      The Umlauts are shown as ?.
      <br>
      <br>
      I'm configuring the SWORD build with CMake like below (without
      ICU!)
      <br>
      <br>
      I remember having similar issues on Linux when building without
      ICU.
      <br>
      <br>
      How do you build SWORD for Bishop? Any suggestions?
      <br>
      <br>
      Best regards,
      <br>
      Tobias
      <br>
      <br>
      -- Check for working CXX compiler:
/opt/Android/SDK/ndk/r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++<br>
      -- Check for working CXX compiler:
/opt/Android/SDK/ndk/r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
      -- works
      <br>
      -- Detecting CXX compiler ABI info
      <br>
      -- Detecting CXX compiler ABI info - done
      <br>
      -- Detecting CXX compile features
      <br>
      -- Detecting CXX compile features - done
      <br>
      -- Check for working C compiler:
/opt/Android/SDK/ndk/r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang<br>
      -- Check for working C compiler:
/opt/Android/SDK/ndk/r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
      -- works
      <br>
      -- Detecting C compiler ABI info
      <br>
      -- Detecting C compiler ABI info - done
      <br>
      -- Detecting C compile features
      <br>
      -- Detecting C compile features - done
      <br>
      -- Configuring your system to build libsword.
      <br>
      -- SWORD Version 1008900000
      <br>
    </blockquote>
  </body>
</html>