code: private int
      mapDevChars(StringBuilder dest, int labelStart, int mappingStart) {
          int length=dest.length();
          boolean didMapDevChars=false;
          for(int i=mappingStart; i<length;) {
              char c=dest.charAt(i);
              switch(c) {
              case 0xdf:
                  // Map sharp s to ss.
                  didMapDevChars=true;
                  dest.setCharAt(i++, 's');
                  dest.insert(i++, 's');
                  ++length;
                  break;
              case 0x3c2:  // Map final sigma to nonfinal sigma.
                  didMapDevChars=true;
                  dest.setCharAt(i++, '\u03c3');
                  break;
              case 0x200c:  // Ignore/remove ZWNJ.
              case 0x200d:  // Ignore/remove ZWJ.
                  didMapDevChars=true;
                  dest.delete(i, i+1);
                  --length;
                  break;
              default:
                  ++i;
                  break;
              }
          }
          if(didMapDevChars) {
              // Mapping deviation characters might have resulted in an un-NFC string.
              // We could use either the NFC or the UTS #46 normalizer.
              // By using the UTS #46 normalizer again, we avoid having to load a second .nrm data file.
              String normalized=uts46Norm2.normalize(dest.subSequence(labelStart, dest.length()));
              dest.replace(labelStart, 0x7fffffff, normalized);
              return dest.length();
          }
          return length;
      }
docs: returns the new dest.length()