Wie werden die Leerzeichen am Ende und / oder am Anfang eines Strings beibehalten?

358

Ich muss diese beiden Zeichenfolgen aus meinen Ressourcen- / Wertedateien verketten:

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on </string>
<string name="Toast_Memory_GameWon_part2"> flips !</string>

Ich mache es so:

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+total_flips+getString(R.string.Toast_Memory_GameWon_part2);

Toast.makeText(this, message_all_pairs_found, 1000).show();

Aber die Leerzeichen am Ende der ersten Zeichenfolge und am Anfang der zweiten Zeichenfolge sind verschwunden (wenn der Toast angezeigt wird) ...

Was sollte ich tun ?

Ich denke, die Antwort ist irgendwo hier in diesem Dokumentationslink

oder ist es so etwas wie &amp ;für das "&" Zeichen zu verwenden?

Hubert
quelle
2
Es gibt ein paar gute Antworten, aber keine davon funktioniert für mich (siehe meine Kommentare). Das Kopfgeld gilt für jede Antwort, mit der ein reales Leerzeichen (U + 0020) als erstes oder letztes Zeichen der Zeichenfolgenressource abgerufen werden kann.
Thomas
3
Böser

Antworten:

502

Selbst wenn Sie die Zeichenfolgenformatierung verwenden, benötigen Sie manchmal noch Leerzeichen am Anfang oder Ende Ihrer Zeichenfolge. In diesen Fällen hilft weder das Entkommen mit \noch das xml:spaceAttribut. Sie müssen eine HTML-Entität &#160;für ein Leerzeichen verwenden.

Verwendung &#160;für nicht zerbrechliche Leerzeichen.
Verwenden Sie &#032;für regelmäßigen Raum.

duessi
quelle
12
Diese Art von Arbeit fügt jedoch einen nicht unterbrechenden Raum (U + 00A0) anstelle eines regulären Raums ein. Das kann in manchen Situationen unerwünscht sein.
Thomas
50
& # 160 funktioniert nicht ... Der XML-Editor gibt einen Fehler aus und Sie können das Projekt nicht erstellen ... \ u0020 funktioniert einwandfrei!
JCAMACHO
10
Sie müssen das Semikolon (;) am Ende hinzufügen.
user1010160
36
\ u0020 ist im Allgemeinen die bessere Lösung. & # 032; erfordert, dass Sie HTML analysieren und kann in einigen Fällen zufällig ignoriert werden, was zu keinem Leerzeichen führt
HaydenKai
5
Unter Android Studio 3.2, das auf einem API 25-Emulator bereitgestellt wurde, habe ich verwendet &#032;, und ich habe keinen Build-Fehler erhalten, aber mein Speicherplatz wurde immer noch ignoriert. &#160;hat funktioniert, aber ich möchte kein nicht zerbrechliches Leerzeichen. Ich möchte nur einen regulären Raum. \u0020hat funktioniert.
Heath Borders
489

Ich bin auf das gleiche Problem gestoßen. Ich wollte am Ende einer Ressourcenzeichenfolge, die einen Feldnamen auf dem Bildschirm darstellt, ein Leerzeichen lassen.

Ich habe eine Lösung für diesen Problembericht gefunden: https://github.com/iBotPeaches/Apktool/issues/124

Dies ist die gleiche Idee, die Duessi vorschlägt. Fügen Sie \u0020direkt in das XML ein Leerzeichen ein, das Sie beibehalten möchten.

Beispiel:

<string name="your_id">Score :\u0020</string>

Der Austausch erfolgt zum Zeitpunkt der Erstellung, daher wird die Leistung Ihres Spiels nicht beeinträchtigt.

DavGin
quelle
funktioniert super. Ich frage mich, was der Unterschied zwischen der Verwendung und & # 160;
Android-Entwickler
3
@androiddeveloper, \ u gibt ein Unicode-Zeichen als Escape-Sequenz an (kein Unicode-Zeichen direkt in der Datei). & # nnn; Gibt eine HTML-Entität an. Dies bedeutet, dass Sie sich darauf verlassen, dass Ihre XML-Zeichenfolge HTML-analysiert wird (dies ist standardmäßig in Textansichten der Fall). Siehe w3schools.com/html/html_entities.asp
greg7gkb
@ greg7gkb Interessant, aber ich wusste nicht, dass es standardmäßig ist. Sie meinen, wenn ich "setText" für die Zeichenfolgenressource verwende, funktioniert es genauso?
Android-Entwickler
@androiddeveloper Ja, ich habe dies gerade im Code bestätigt. Sie können HTML-Entitäten in Ihrer XML-Datei für Zeichenfolgen haben, die standardmäßig mit setText (int resId) konvertiert werden. Beispiel: <string name = "test"> T & # 160; S & # 160; T & # 160; </ string>.
Greg7gkb
5
\u0020ist SPACE des ASCII-Codes. Dies war die beste Wahl für mein Projekt, da ich sicherstellen musste, dass es ASCII war.
OneWorld
138

Diese Dokumentation schlägt vor, dass das Zitieren funktioniert:

<string name="my_str_spaces">" Before and after? "</string>
Skywalker5446
quelle
2
Garantiert es<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek
5
So mehr als die Verwendung von Unicode-Zeichen! Vielen Dank!
Sumit Anantwar
2
Leider fügen einige Lokalisierungstools wie Passolo automatisch einen Schrägstrich vor dem Zitat hinzu. Und string wird zu folgendem: <string name = "my_str_spaces"> \ "Vorher und nachher? \" </ String>. Daher erscheinen diese Anführungszeichen im Text. Die Verwendung von \ u0020 scheint in diesem Fall also besser zu sein.
Fox
Ich sehe dies nirgends in der Dokumentation erwähnt. Das nächste, was ich sehen kann, ist, Enclose the entire string in double quotes ("This'll work", for example)wo es darum geht, einem zu entkommen Single quote (').
Heath Borders
Das funktioniert bei mir nicht
James Riordan
38

Ich verwende nur den UTF-Code für das Leerzeichen "\ u0020" in der Datei strings.xml.

<string name="some_string">\u0020The name of my string.\u0020\u0020</string>

funktioniert super. (Android liebt UTF-Codes)

Jasen
quelle
2
Dies funktionierte bei mir, wo die akzeptierte Antwort nicht funktionierte.
Lance
1
Gibt es etwas Neues in der bestehenden Antwort ?
user905686
21

Diese Frage mag alt sein, aber der einfachste Weg, dies zu tun, ist das Hinzufügen von Anführungszeichen. Zum Beispiel:

<string name="Toast_Memory_GameWon_part1">"you found ALL PAIRS ! on "</string>
<string name="Toast_Memory_GameWon_part2">" flips !"</string>
Kyay
quelle
das funktioniert perfekt. Umgeben Sie einfach Ihren gewünschten Text mit Anführungszeichen "Ihr Text"
Tarun Kumar
10

Es ist möglich, mit unterschiedlichen Breiten zu platzieren:

<string name="space_demo">|&#x20;|&#x2009;|&#x200A;||</string>

| RAUM | DÜNNER RAUM | HAARRAUM | kein Leerzeichen |

Visualisierung:

Geben Sie hier die Bildbeschreibung ein

Andrey
quelle
8

Wenn du es wirklich so machen willst, wie du es gemacht hast, dann musst du es sagen, dass das Leerzeichen relevant ist, indem du ihm entkommst:

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on\ </string>
<string name="Toast_Memory_GameWon_part2">\ flips !</string>

Ich würde hierfür jedoch die Zeichenfolgenformatierung verwenden . So etwas wie das Folgende:

<string name="Toast_Memory_GameWon">you found ALL PAIRS ! on %d flips !</string>

dann

String message_all_pairs_found = String.format(getString(R.string.Toast_Memory_GameWon), total_flips);
Jeremy Logan
quelle
1
Es funktioniert nicht, mit einem Backslash zu entkommen (zumindest für mich). Die Verwendung einer Formatzeichenfolge ist im Allgemeinen eine gute Lösung, jedoch nicht immer. Zum Beispiel String.formatviele Speicherzuordnungen verursacht , die in einem Spiel unerwünscht sind.
Thomas
Das Entkommen aus den Leerzeichen (mit dem "\") hat auch bei mir nicht funktioniert.
Android-Entwickler
Die Formatierung funktioniert nur, wenn Ihr Text alle im gleichen Stil angezeigt wird. In meinem Fall sind die 2 Dinge, die verbunden werden, fett gegen normal und verschiedene Farben.
5

Verwenden Sie "" mit dem Zeichenfolgenressourcenwert.

Beispiel: "Wert mit Leerzeichen"

ODER

Verwenden Sie den Code \ u0020 für Leerzeichen.

Bhupendra Joshi
quelle
4

Funktioniert gut Ich benutze \ u0020

<string name="hi"> Hi \u0020 </string>
<string name="ten"> \u0020 out of 10  </string>
<string name="youHaveScored">\u0020 you have Scored \u0020</string>

Java-Datei

String finalScore = getString(R.string.hi) +name+ getString(R.string.youHaveScored)+score+ getString(R.string.ten);
               Toast.makeText(getApplicationContext(),finalScore,Toast.LENGTH_LONG).show();

Screenshot hier Bild der Anzeige der Funktionsweise dieses Codes

Tarsbir Singh
quelle
2

Es kann ein Argument für das programmgesteuerte Hinzufügen des Leerzeichens angeführt werden. Da diese Fälle häufig in Verkettungen verwendet werden, habe ich beschlossen, den Wahnsinn zu stoppen und nur das Alte zu tun + " " +. Diese werden in den meisten europäischen Sprachen Sinn machen , würde ich zusammenfassen.

MPelletier
quelle
1

Alle Antworten hier haben bei mir nicht funktioniert. Stattdessen habe XMLich dies getan , um ein Leerzeichen am Ende eines Strings in hinzuzufügen

<string name="more_store">more store<b> </b> </string>
toobsco42
quelle
0

Ich habe keine Ahnung von Android, aber dies sieht aus wie die übliche Behandlung von XML-Leerzeichen - führende und nachfolgende Leerzeichen innerhalb eines Elements werden im Allgemeinen als unbedeutend angesehen und entfernt. Versuchen Sie xml:space:

<string name="Toast_Memory_GameWon_part1" xml:space="preserve">you found ALL PAIRS ! on </string>
<string name="Toast_Memory_GameWon_part2" xml:space="preserve"> flips !</string>
Pavel Minaev
quelle
Scheint leider xml:spaceignoriert zu werden.
Thomas
0

Dies beantwortet möglicherweise nicht die Frage (wie Whitespaces in XML gehalten werden), löst jedoch möglicherweise das zugrunde liegende Problem eleganter.

Anstatt sich nur auf die XML-Ressourcen zu verlassen, verketten Sie mit Formatzeichenfolgen. Entfernen Sie also zuerst die Leerzeichen

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on</string>
<string name="Toast_Memory_GameWon_part2">flips !</string>

Und dann bauen Sie Ihren String anders:

String message_all_pairs_found = 
      String.format(Locale.getDefault(), 
                    "%s %d %s", 
                    getString(R.string.Toast_Memory_GameWon_part1),
                    total_flips,
                    getString(R.string.Toast_Memory_GameWon_part2);

Toast.makeText(this, message_all_pairs_found, 1000).show();
Skusku
quelle
0

Es gibt auch die Lösung der Verwendung CDATA. Beispiel:

<string name="test"><![CDATA[Hello          world]]></string>

Aber im Allgemeinen finde ich \u0020das gut genug.

Android-Entwickler
quelle
-1

Wenn Sie den Speicherplatz benötigen, um ihn später mit anderen Zeichenfolgen zu verketten, können Sie den Ansatz zur Zeichenfolgenformatierung verwenden, um Ihrer Zeichenfolgendefinition Argumente hinzuzufügen:

<string name="error_">Error: %s</string>

Dann für das Formatieren der Zeichenfolge (z. B. wenn Sie einen vom Server zurückgegebenen Fehler haben, andernfalls verwenden getString(R.string.string_resource_example)):

String message = context.getString(R.string.error_, "Server error message here")

Was in ... resultiert:

Error: Server error message here
Das es
quelle
-6

Es funktioniert nicht mit xml: space = "bewahren"

also habe ich es am schnellsten gemacht =>

Ich habe einfach ein + "" + hinzugefügt, wo ich es brauchte ...

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+" "+total_flips+" "+getString(R.string.Toast_Memory_GameWon_part2);
Hubert
quelle
2
Was bringt es, Ressourcen überhaupt zu verwenden, wenn Sie nur einige Java-String-Literale einmischen?
Kristopher Johnson