diff --git a/native/jni/src/bigram_dictionary.cpp b/native/jni/src/bigram_dictionary.cpp
index 44dc75e9c54eaa03fdcb05d9e2961a3f142e8e47..ef0434c49d33fdb1c15dde4587fb602c96994ad7 100644
--- a/native/jni/src/bigram_dictionary.cpp
+++ b/native/jni/src/bigram_dictionary.cpp
@@ -21,6 +21,7 @@
 #include "bigram_dictionary.h"
 #include "binary_format.h"
 #include "bloom_filter.h"
+#include "char_utils.h"
 #include "defines.h"
 #include "dictionary.h"
 
@@ -50,7 +51,7 @@ void BigramDictionary::addWordBigram(int *word, int length, int frequency, int *
     int insertAt = 0;
     while (insertAt < MAX_RESULTS) {
         if (frequency > bigramFreq[insertAt] || (bigramFreq[insertAt] == frequency
-                && length < Dictionary::wideStrLen(
+                && length < getCodePointCount(MAX_WORD_LENGTH,
                         bigramCodePoints + insertAt * MAX_WORD_LENGTH))) {
             break;
         }
diff --git a/native/jni/src/dictionary.h b/native/jni/src/dictionary.h
index 121cf058d8e7a0f66640cd343991e2c9c8d79c9c..83676b204870a76cdb0b9d3ad8418244272b305c 100644
--- a/native/jni/src/dictionary.h
+++ b/native/jni/src/dictionary.h
@@ -65,10 +65,6 @@ class Dictionary {
     int getDictBufAdjust() const { return mDictBufAdjust; }
     virtual ~Dictionary();
 
-    // public static utility methods
-    // static inline methods should be defined in the header file
-    static int wideStrLen(int *str);
-
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(Dictionary);
     const uint8_t *mDict;
@@ -84,17 +80,5 @@ class Dictionary {
     const BigramDictionary *mBigramDictionary;
     SuggestInterface *mGestureSuggest;
 };
-
-// public static utility methods
-// static inline methods should be defined in the header file
-inline int Dictionary::wideStrLen(int *str) {
-    if (!str) return 0;
-    int length = 0;
-    while (*str) {
-        str++;
-        length++;
-    }
-    return length;
-}
 } // namespace latinime
 #endif // LATINIME_DICTIONARY_H