package basics.encoding;

import sun.text.Normalizer;
import basics.testing.Units;

public class UTF8Utl
{
/**
 * UTF8 normalisation, removes diacritics. Uses Unicode NFKD decomposition.
 * 
 * @author kst, Robert Casties
 */
/**
 * "Soft" normalisation. Decomposes characters (Unicode NFKD) and removes
 * diacritical marks (Unicode category Mn). Returns decomposed String. The
 * returned String may still contain non-ASCII characters.
 * 
 * @param input
 * @return
 */
public static String normalize(String input)
{
   if(input == null)
      return null;
   // decompose to NFKD
   String decomposed = Normalizer.decompose(input, true, 0);
   // decomposed String may be longer
   int size = decomposed.length();
   StringBuffer normalized = new StringBuffer(size);
   for(int i = 0; i < size; i++)
   {
      int c = decomposed.codePointAt(i);
      if(!(Character.getType(c) == Character.NON_SPACING_MARK))
      {
         normalized.appendCodePoint(c);
      }
   }
   return normalized.toString();
}

/**
 * ASCII normalisation. Decomposes characters (Unicode NFKD) and removes
 * all non-ASCII characters (codepoints >= 127). Returns decomposed String.
 * 
 * @param input
 * @return
 */
public static String normalizeToAscii(String input)
{
   if(input == null)
      return null;
   // decompose to NFKD
   String decomposed = Normalizer.decompose(input, true, 0);
   // decomposed String may be longer
   int size = decomposed.length();
   StringBuffer normalized = new StringBuffer(size);
   for(int i = 0; i < size; i++)
   {
      int c = decomposed.codePointAt(i);
      if(c < 127)
      {
         normalized.appendCodePoint(c);
      }
   }
   return normalized.toString();
}

public static void unittest()
{
   String r = normalize("aáa");
   Units.assertEqualsTrue(r, "aaa", "normalize failed: diacritics: " + r);
   r = normalize("äü");
   Units.assertEqualsTrue(r, "au", "normalize failed: umlauts: " + r);
   r = normalize("ß");
   Units.assertEqualsTrue(r, "", "normalize failed: sz-lig: " + r);
}
}
