Convierta el texto Unicode a los glifos de fuente para mostrar en dispositivos Android -- java campo con android campo con utf-8 camp codereview Relacionados El problema

Convert Unicode text to font glyphs for display on Android devices


3
vote

problema

Español

Antes de Android 6.0, el texto Mongoliano no es compatible con dispositivos Android. Y por lo que sé, OpenType Smart Font Rendering aún no es compatible. Por lo tanto, en todas mis aplicaciones mongoles, utilizo una clase de representación para convertir texto de Unicode a la PUA glifa adecuada en función del contexto.

El siguiente es el método principal de la clase (clase completa en GitHub aquí ):

  public String unicodeToGlyphs(String inputString) {     StringBuilder outputString = new StringBuilder();     StringBuilder subString = new StringBuilder();      if (inputString == null || inputString.length() == 0) {         return "";     }      // Loop through characters in string     boolean isMongolSubString = isMongolian(inputString.charAt(0));     for (char character : inputString.toCharArray()) {          if (isMongolian(character) || character == Uni.NNBS || character== CURSOR_HOLDER) {              if (!isMongolSubString) {                 outputString.append(subString.toString());                 subString.setLength(0);             }              subString.append(character);             isMongolSubString = true;          } else { // non-Mongol character              if (isMongolSubString) {                  // XXX This is not DRY code, see below                 // break up word from suffixes                 String[] parts = subString.toString().split(String.valueOf(Uni.NNBS), -1);                 for (int j = 0; j < parts.length; j++) {                     if (j == 0) { // this is the main word                         // Convert mongol word to glyphs and add to output string                         outputString.append(convertWord(parts[j]));                     } else { // these are the suffixes                         // remove the cursor holder character                         String tempSuffix = parts[j].replace(String.valueOf(CURSOR_HOLDER), "");                         outputString.append(Uni.NNBS);                         if (mSuffixMap.containsKey(tempSuffix)) {                             outputString.append(mSuffixMap.get(tempSuffix));                             if (parts[j].contains(String.valueOf(CURSOR_HOLDER))) {                                 outputString.append(CURSOR_HOLDER);                             }                         } else {                             outputString.append(convertWord(parts[j]));                         }                     }                 }                   // reset substring                 subString.setLength(0);                 subString.append(character);              } else {                 // Add nonMongol chars to string                 subString.append(character);             }             isMongolSubString = false;         }     }      // Add any final substring     if (subString.length() > 0) {         if (isMongolSubString) {               // XXX This is not DRY code, see above             // break up word from suffixes             String[] parts = subString.toString().split(String.valueOf(Uni.NNBS), -1);             for (int j = 0; j < parts.length; j++) {                 if (j == 0) { // this is the main word                     // Convert mongol word to glyphs and add to output string                     outputString.append(convertWord(parts[j]));                 } else { // these are the suffixes                     String tempSuffix = parts[j].replace(String.valueOf(CURSOR_HOLDER), "");                     outputString.append(Uni.NNBS);                     if (mSuffixMap.containsKey(tempSuffix)) {                         outputString.append(mSuffixMap.get(tempSuffix));                         if (parts[j].contains(String.valueOf(CURSOR_HOLDER))) {                             outputString.append(CURSOR_HOLDER);                         }                     } else {                         outputString.append(convertWord(parts[j]));                     }                 }             }           } else {             // Add nonMongol chars to string             outputString.append(subString.toString());         }     }      return outputString.toString(); }   

Área de preocupación:

Repito el siguiente bloqueo de código. Sé que no es bueno repetirme, pero si lo rompo en otro método, tendré que hacer una variable de clase (agregar un estado innecesario es malo, ¿verdad?) O modificar un parámetro de método en su lugar (lo que entiendo Generalmente no es una buena idea).

  // break up word from suffixes String[] parts = subString.toString().split(String.valueOf(Uni.NNBS), -1); for (int j = 0; j < parts.length; j++) {     if (j == 0) { // this is the main word         // Convert mongol word to glyphs and add to output string         outputString.append(convertWord(parts[j]));     } else { // these are the suffixes         String tempSuffix = parts[j].replace(String.valueOf(CURSOR_HOLDER), "");         outputString.append(Uni.NNBS);         if (mSuffixMap.containsKey(tempSuffix)) {             outputString.append(mSuffixMap.get(tempSuffix));             if (parts[j].contains(String.valueOf(CURSOR_HOLDER))) {                 outputString.append(CURSOR_HOLDER);             }         } else {             outputString.append(convertWord(parts[j]));         }     } }   
Original en ingles

Prior to Android 6.0, Mongolian text is not supported on Android devices. And as far as I know, OpenType smart font rendering is still not supported. Therefore, in all my Mongolian apps I use a rendering class to convert Unicode text to the appropriate PUA glyph based on the context.

The following is the main method of the class (full class on GitHub here):

public String unicodeToGlyphs(String inputString) {     StringBuilder outputString = new StringBuilder();     StringBuilder subString = new StringBuilder();      if (inputString == null || inputString.length() == 0) {         return "";     }      // Loop through characters in string     boolean isMongolSubString = isMongolian(inputString.charAt(0));     for (char character : inputString.toCharArray()) {          if (isMongolian(character) || character == Uni.NNBS || character== CURSOR_HOLDER) {              if (!isMongolSubString) {                 outputString.append(subString.toString());                 subString.setLength(0);             }              subString.append(character);             isMongolSubString = true;          } else { // non-Mongol character              if (isMongolSubString) {                  // XXX This is not DRY code, see below                 // break up word from suffixes                 String[] parts = subString.toString().split(String.valueOf(Uni.NNBS), -1);                 for (int j = 0; j < parts.length; j++) {                     if (j == 0) { // this is the main word                         // Convert mongol word to glyphs and add to output string                         outputString.append(convertWord(parts[j]));                     } else { // these are the suffixes                         // remove the cursor holder character                         String tempSuffix = parts[j].replace(String.valueOf(CURSOR_HOLDER), "");                         outputString.append(Uni.NNBS);                         if (mSuffixMap.containsKey(tempSuffix)) {                             outputString.append(mSuffixMap.get(tempSuffix));                             if (parts[j].contains(String.valueOf(CURSOR_HOLDER))) {                                 outputString.append(CURSOR_HOLDER);                             }                         } else {                             outputString.append(convertWord(parts[j]));                         }                     }                 }                   // reset substring                 subString.setLength(0);                 subString.append(character);              } else {                 // Add nonMongol chars to string                 subString.append(character);             }             isMongolSubString = false;         }     }      // Add any final substring     if (subString.length() > 0) {         if (isMongolSubString) {               // XXX This is not DRY code, see above             // break up word from suffixes             String[] parts = subString.toString().split(String.valueOf(Uni.NNBS), -1);             for (int j = 0; j < parts.length; j++) {                 if (j == 0) { // this is the main word                     // Convert mongol word to glyphs and add to output string                     outputString.append(convertWord(parts[j]));                 } else { // these are the suffixes                     String tempSuffix = parts[j].replace(String.valueOf(CURSOR_HOLDER), "");                     outputString.append(Uni.NNBS);                     if (mSuffixMap.containsKey(tempSuffix)) {                         outputString.append(mSuffixMap.get(tempSuffix));                         if (parts[j].contains(String.valueOf(CURSOR_HOLDER))) {                             outputString.append(CURSOR_HOLDER);                         }                     } else {                         outputString.append(convertWord(parts[j]));                     }                 }             }           } else {             // Add nonMongol chars to string             outputString.append(subString.toString());         }     }      return outputString.toString(); } 

Area of concern:

I repeat the following code block. I know its not good to repeat myself but if I break this off into another method, I will either have to make a class variable (adding unnecessary state is bad, too, right?) or modify a method parameter in place (which I understand is generally not a good idea).

// break up word from suffixes String[] parts = subString.toString().split(String.valueOf(Uni.NNBS), -1); for (int j = 0; j < parts.length; j++) {     if (j == 0) { // this is the main word         // Convert mongol word to glyphs and add to output string         outputString.append(convertWord(parts[j]));     } else { // these are the suffixes         String tempSuffix = parts[j].replace(String.valueOf(CURSOR_HOLDER), "");         outputString.append(Uni.NNBS);         if (mSuffixMap.containsKey(tempSuffix)) {             outputString.append(mSuffixMap.get(tempSuffix));             if (parts[j].contains(String.valueOf(CURSOR_HOLDER))) {                 outputString.append(CURSOR_HOLDER);             }         } else {             outputString.append(convertWord(parts[j]));         }     } } 
        

Lista de respuestas


Relacionados problema

5  ¿Mejor código para convertir un carácter a su representación de codificación UTF-8 por ciento?  ( Better code for converting a char to its utf 8 percent encoding representation ) 
Este es un código de trabajo para una implementación de plantilla URI (RFC 6570); Cuando el carácter a renderizar no está dentro de un conjunto de caracteres ...

8  MYUTF-8 PEQUEÑO LIB (validate UTF-8, Guess Language, Count Buds)  ( Myutf 8 small lib validate utf 8 guess language count chars ) 
Soy nuevo en el idioma de C y nunca me conseguí en los detalles de UTF-8, y después de leer Algunos artículos Al respecto, quería intentar jugar con UTF-8 c...

4  Code Unicode CodePounts a UTF-8 manualmente  ( Encode unicode codepoints to utf 8 manually ) 
Quiero codificar los puntos de código Unicode a UTF-8 manualmente. Escribí el siguiente código C #. Lo probé con algunos casos que conozco, pero me gustaría s...

8  Comprobación de si un fragmento de cadena podría ser parte de una cadena UTF-8 más larga  ( Checking whether a string fragment could be part of a longer utf 8 string ) 
Aunque la validación UTF-8 es una tarea común, estoy tratando de resolver una tarea ligeramente diferente; Dada una cadena de bytes, haga ejercicio si podría ...

15  Cuenta byte Longitud de la cadena  ( Count byte length of string ) 
Estoy buscando algunos punteros de orientación y optimización para mi función de JavaScript personalizado que cuenta los bytes en una cadena en lugar de solo ...

4  Truncando personaje incompleto UTF-8  ( Truncating incomplete utf 8 character ) 
He creado una función que trunca un carácter UTF-8 incompleto al final de std::string en C ++. La biblioteca estándar de C ++ aún no admite el carácter ba...

4  Macros para detectar UTF-8  ( Macros to detect utf 8 ) 
Estoy trabajando en un programa que maneja los caracteres UTF-8. He hecho las siguientes macros para detectar UTF-8. Los he probado con unos pocos mil palabra...

5  Convertir una mezcla de Latín 1 y UTF-8 a UTF-8 adecuado  ( Convert a mix of latin 1 and utf 8 to proper utf 8 ) 
El siguiente programa toma una secuencia byte arbitraria como entrada y salidas UTF-8 bien formadas. Todas las secuencias UTF-8 de la entrada se copian sin mo...

7  Función de lector de caracteres UTF-8  ( Utf 8 character reader function ) 
Puede ver el código completo aquí (nota que el enlace apunta a la confirmación específica). El lenguaje es "limpio C" (es decir, un subconjunto de C89, C9...

7  Convierte la cadena UTF8 a la cadena UTF32 en C  ( Convert utf8 string to utf32 string in c ) 
Estoy haciendo alguna programación recreativa en C (después de pasar algún tiempo en C ++, pero profesionalmente usando solo PHP / JavaScript). Escribí un c...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos