Unicode-Zeichen werden in TextView.setText nicht angezeigt

Ich kann eine TextView nicht dazu bringen, Unicode-Zeichen korrekt dynamisch anzuzeigen, und das macht mich verrückt. Ich habe es auf das absolute Minimum reduziert, aber das TextView, das von setText aufgefüllt wird, zeigt immer noch Diamanten mit Fragezeichen in ihnen für die Unicode-Zeichen. Die von strings.xml aufgefüllte Version zeigt die Multibyte-Zeichen perfekt an. Hier ist die Aktivität:

public class TestMultibyteActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.main ); TextView textField = (TextView) findViewById( R.id.text_field ); String str = "Tübingen systemportefølje"; Log.d( "MULTIBYTE", str ); //note that this prints the multibyte chars correctly. //EDIT: oh crap, no it doesn't. might be onto something here... textField.setText( str ); } } 

Und hier ist das Layout:

      

Hier ist strings.xml:

   TestMultibyteActivity Tübingen systemportefølje  

Ich baue mit Ameisen. Hier sind meine default.properties:

 target=Google Inc.:Google APIs:8 

Und hier ist meine AndroidManifest.xml

            

Ich habe an alles gedacht, was mir einfällt, aber es scheint, als ob Unicode-Zeichen durch die CharSequence-Schnittstelle geteilt werden, und ich kann nicht herausfinden, warum.

   

Leider kann man das einfach nicht aus strings.xml AFAIK tun.

Du hast eines von zwei Dingen.

  • Hinzufügen des Unicode-Zeichens innerhalb von Java zur Zeichenfolge in der XML-Datei:

     String str = "\u00A9" + getContext().getString(R.string.your_string); 
  • Eingabe des Textes als HTML in Java:

     yourTextView.setText(Html.fromHtml("your chars")); 

Ich hoffe, das ist nützlich.

Es könnte so einfach gemacht werden:

 str.replace("uoo26","&"); 

Ich hatte Probleme, Unicode-Zeichen aus einer benutzerdefinierten Schriftart anzuzeigen, die im privaten Unicode-Bereich zugeordnet wurden. Dies ist ein häufiger Bereich, in dem fonts wie MaterialDesign und FontAwesome ihre Symbolschriftarten zuordnen. Nur zur Verdeutlichung habe ich das auf einer Android-Version 4.4.2 getestet, also ist das vielleicht kein Problem bei späteren Versionen (ist aber wahrscheinlich). Ich hatte alle Kombinationen von “\ uF151”, & # xF151 versucht, und ich habe auch die Html.fromHtlm versucht. Keine dieser Techniken funktionierte, um die Zeichen im privaten Bereich von Unicode korrekt anzuzeigen. Wenn ich mich an den Bereich \ u00xx halte, funktionierte alles gut für die Schriften, die an diesen Stellen Unicode-Codes hatten. (Den beiden fonts, die ich erwähnt habe, sind keine Symbole zugeordnet)

Bei der Überprüfung der Schriftart mit der Microsoft-Zeichentabelle habe ich festgestellt, dass die Zeichen im privaten Unicode-Bereich nicht angezeigt wurden, als ich den Windows-Englisch-Zeichensatz für die Zeichensätze ausgewählt hatte. Die Zeichen würden angezeigt, wenn ich den Unicode-Zeichensatz wählte; und im Falle der Schriftart Material Design, wenn ich den japanischen Zeichensatz ausgewählt habe.

Was ich getan habe, um das Zeichen in textView anzuzeigen, war, das Gebietsschema auf Japanisch zu ändern, setText auf dem Textview-Objekt aufzurufen, ihm den korrekten privaten Unicode-Wert zu übergeben und das Zeichen dann korrekt anzuzeigen. Also, hier ist der Code, den ich verwendet habe, um Symbol Schriftart Symbol und dann wieder zurück zu Englisch:

  TextView tv = (TextView)findViewById(R.id.myTextViewObject); Typeface tf = Typeface.createFromAsset(this.getAssets(), "material_design.ttf"); tv.setTypeface(tf); String x = "\uE693"; tv.setText(x); setDefaultLocale(getApplicationContext(),"en"); tv.append("hello"); 

Und hier ist der Code für die Methode setDefaultLocale:

 public static void setDefaultLocale(Context context, String locale) { Locale locJa = new Locale(locale.trim()); Locale.setDefault(locJa); Configuration config = new Configuration(); config.locale = locJa; context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); locJa = null; config = null; } 

Im Fall von FontAwesome müssen Sie den chinesischen Zeichensatz “Tradition” auswählen, um auf die privaten Unicode-Bereichscodes zugreifen zu können.

Sie könnten fragen, warum ich den Zeichensatz “Unicode” nicht ausgewählt habe? Der Zeichensatz, den Android verwendet, basiert auf dem aktuellen Gebietsschema und ich konnte keine Möglichkeit finden, Unicode als das aktuelle Gebietsschema auszuwählen. Außerdem konnte ich keine Möglichkeit finden, die privaten Bereichs-Unicodes in mein bestehendes Gebietsschema zu mappen. Ich kann Ihnen auch nicht sagen, ob dies ein Problem ist, wie diese TrueType-Fonts konstruiert wurden oder ob dies ein Android-Problem ist (obwohl ich denke, dass es einen Grund geben sollte, den privaten Gebietscode für die Verwendung in Ihrem vorhandenen Gebietsschema zuzuordnen). Was ich gelernt habe, ist, dass alle Unicode-Codepunkte in allen Sprachlokalen für die gleiche Schriftart zugeordnet sind. Das ist die Sache, von der ich glaube, dass sie viele Leute verwirrt, wenn sie Schriften verwenden, die Unicode unterstützen. Die Windows-Zeichentabelle war für mich ein nützliches Werkzeug, um zu bestimmen, welche Zeichenpunkte in welchen Zeichensatz abgebildet werden.

Die akzeptierte Antwort ist korrekt, aber Html.fromHtml ist jetzt veraltet. Sie müssen also Folgendes verwenden:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { textView.setText(Html.fromHtml(user.getInput(), Html.FROM_HTML_MODE_LEGACY)); } else { textView.setText(Html.fromHtml(user.getInput())); }