2012-02-21 17 views
16

En < cadena-array name = "versiones"> Tengo esta bestia de una entrada (reducido a un mínimo razonable para reproducir el efecto):escape múltiples caracteres “%” en Android

<item>100% foo 40%bar</item> 

cuales produce estos errores:

Multiple annotations found at this line: 
- error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute? 
- error: Found tag </item> where </string-array> is expected 

Agregar formatted = "false" no cambia nada.

<item>100&#37; foo 40&#37;bar</item> 

produce los mismos mensajes de error. ¿WTH?

<item>100% foo 40bar</item> 
<item>100 foo 40%bar</item> 
<item>100% foo 40%</item> 

would all work fine. Escaparlo con \% simplemente se ignora, lo que da como resultado el mismo error. %% no genera un error, pero obtengo %%.

+0

http://stackoverflow.com/questions/4414389/android-xml-percent-symbol/4417333#4417333, la mayor parte de lo que dice no funcionará, pero vea la última opción. –

+0

Gracias por la respuesta. Lamentablemente, no estoy tratando con una cadena que permita la sustitución a menos que haya una forma de hacer sustituciones en las matrices. En mi arrays.xml hay una matriz de cadenas con elementos. Estos los cargo a través de getResources(). GetStringArray (R.array.versions); – Giszmo

+0

ouch, getStringArray usa el formateador pero no le permite pasar argumentos de formato. Me temo que tendrá que volver a crear la matriz después de cargarla, sustituyendo en% o corregir las cadenas a medida que las utiliza. –

Respuesta

21

codifica cada una como un carácter Unicode en el xml funciona para mí:

<string name="test">100\u0025 foo 40\u0025bar</string> 
+1

Ok, creo que este debería ser el camino a seguir. Aún así, me gustaría entender por qué ambos % y \ u0025 son% pero la versión 1 me hace correr el error ?? – Giszmo

+3

Perdí unos buenos 20 minutos en esto, así que espero que pueda ahorrar tiempo para otra persona. Teniendo cadena para formatear, tuve que usar, por ejemplo, Puntuación: % .2f %%. Dos% de caracteres, adjunto al formato. Ninguno de los anteriores funcionó en este caso. – donnadulcinea

+0

Esto funcionó para mí, gracias. – Kedarnath

1

Usando CDATA puede trabajar ..

<item><![CDATA[100% foo 40%]]></item> 
+0

No funciona con 'CDATA' a menos que use' %% '. – mike47

16

El % es un carácter reservado en XML como <, >, etc. Use %% para cada % que esté utilizando en el recurso de cadena.

+3

Llegas un poco tarde con tu respuesta, pero gracias de todos modos: D Puedo probar tu solución si me encuentro con el desarrollo de Android pronto, pero dado que he intentado '%' pensé que ya había escapado lo suficiente. '\ %%' es definitivamente mejor que '\ u0025' ... bueno ... quizás no" definitivamente ". :) – Giszmo

+0

'%%' fue el único que funcionó para mí. Esta es mi cadena final '(% 1 $ s %% commission)' que se traduce, por ejemplo, en '(2.56% de comisión)' – Laranjeiro

+3

% ciertamente no es un carácter reservado en XML; esta restricción de contenido es específica de los archivos de recursos de Android. – Cumbayah

Cuestiones relacionadas