code: public String getSkeleton(CharSequence str) {
          // Apply the skeleton mapping to the NFD normalized input string
          // Accumulate the skeleton, possibly unnormalized, in a String.
          String nfdId = nfdNormalizer.normalize(str);
          int normalizedLen = nfdId.length();
          StringBuilder skelSB = new StringBuilder();
          for (int inputIndex = 0; inputIndex < normalizedLen;) {
              int c = Character.codePointAt(nfdId, inputIndex);
              inputIndex += Character.charCount(c);
              this.fSpoofData.confusableLookup(c, skelSB);
          }
          String skelStr = skelSB.toString();
          skelStr = nfdNormalizer.normalize(skelStr);
          return skelStr;
      }
docs: Get the "skeleton" for an identifier string. Skeletons are a transformation of the input string; Two strings are
  confusable if their skeletons are identical. See Unicode UAX 39 for additional information.
  
  Using skeletons directly makes it possible to quickly check whether an identifier is confusable with any of some
  large set of existing identifiers, by creating an efficiently searchable collection of the skeletons.
  
  Skeletons are computed using the algorithm and data described in Unicode UAX 39.
  
  @param str
  The input string whose skeleton will be generated.
  @return The output skeleton string.
  
  @hide draft / provisional / internal are hidden on Android