quitar - string[] c# ejemplos
¿Dónde puedo encontrar una lista de caracteres escapados en las constantes de cadena de MSIL? (1)
Actualizar
Basado en la experimentación con el compilador de C # + ildasm.exe: quizás la razón por la que no hay una lista de caracteres escapados es porque hay muy pocos: precisamente 6.
Partiendo de la IL generada por ildasm, de los programas C # compilados por Visual Studio 2010 :
- IL es estrictamente ASCII .
- Tres personajes de espacios en blanco tradicionales se escapan
-
/t
: 0x09: (pestaña) -
/n
: 0x0A: (nueva línea) -
/r
: 0x0D: (retorno de carro)
-
- Se escapan tres caracteres de puntuación:
-
/"
: 0x22: (comillas dobles) -
/?
: 0x3F: (signo de interrogación) -
//
: 0x5C: (barra invertida)
-
- Solo los siguientes caracteres se incluyen intactos en las cadenas literales 0x20 - 0x7E, (sin incluir los tres caracteres de puntuación)
- Todos los demás caracteres , incluidos los caracteres de control ASCII por debajo de 0x20 y todo desde 0x7F en adelante, se convierten en matrices de bytes. O, más bien, cualquier cadena que contenga cualquier otro carácter que no sea el 92 literal y los 6 caracteres anteriores, se convierte en una matriz de bytes, donde los bytes son los bytes little-endian de una cadena UTF-16.
Ejemplo 1: ASCII por encima de 0x7E: Un é acentuado simple (U + 00E9)
C #: Se convierte "é"
o "/u00E9"
(el byte E9
es lo primero )
ldstr bytearray (E9 00 )
Ejemplo 2: UTF-16: Símbolo de suma ∑ (U + 2211)
C #: O "∑"
o "/u2211"
convierten ( 11
bytes primero )
ldstr bytearray (11 22 )
Ejemplo 3: UTF-32: mathematical matemático de doble pulsación (U + 1D538)
C #: Se "𝔸"
o en par sustituto UTF-16 "/uD835/uDD38"
(bytes dentro de carácter invertido, pero caracteres de doble byte en orden general)
ldstr bytearray (35 D8 38 DD )
Ejemplo 4: la conversión de la matriz de bytes es para una cadena completa que contiene un carácter no Ascii
C #: "In the last decade, the German word /"über/" has come to be used frequently in colloquial English."
se convierte en
ldstr bytearray (49 00 6E 00 20 00 74 00 68 00 65 00 20 00 6C 00
61 00 73 00 74 00 20 00 64 00 65 00 63 00 61 00
64 00 65 00 2C 00 20 00 74 00 68 00 65 00 20 00
47 00 65 00 72 00 6D 00 61 00 6E 00 20 00 77 00
6F 00 72 00 64 00 20 00 22 00 FC 00 62 00 65 00
72 00 22 00 20 00 68 00 61 00 73 00 20 00 63 00
6F 00 6D 00 65 00 20 00 74 00 6F 00 20 00 62 00
65 00 20 00 75 00 73 00 65 00 64 00 20 00 66 00
72 00 65 00 71 00 75 00 65 00 6E 00 74 00 6C 00
79 00 20 00 69 00 6E 00 20 00 63 00 6F 00 6C 00
6C 00 6F 00 71 00 75 00 69 00 61 00 6C 00 20 00
45 00 6E 00 67 00 6C 00 69 00 73 00 68 00 2E 00 )
Directamente, "no puedes" (busca una lista de escapes de cadenas de MSIL ), pero aquí hay algunos datos útiles ...
ECMA-335 , que contiene la definición estricta de CIL, no especifica qué caracteres deben escaparse en los literales QSTRING, solo que pueden escaparse utilizando la barra invertida /
carácter. Las notas más importantes son:
- Los literales Unicode se presentan como octales , no hexadecimales (es decir,
/042
, no/u0022
). - Las cadenas pueden extenderse a lo largo de varias líneas utilizando el carácter
/
, ver más abajo
Los únicos escapes mencionados explícitamente son tab /t
, linefeed /n
y octal numeric escapes. Esto es un poco molesto para usted ya que C # no tiene un literal octal; tendrá que realizar su propia extracción y conversión, por ejemplo, utilizando el Convert.ToInt32([string], 8)
.
Más allá de eso, la elección de escapes es "específica de la implementación" al "ensamblador hipotético de IL" descrito en la especificación. Entonces, su pregunta con razón pregunta acerca de las reglas para MSIL , que es la implementación estricta de CIL por parte de Microsoft. Por lo que puedo decir, MS no ha documentado su elección de escapes. Podría ser útil, al menos, preguntar a la gente de Mono qué usan. Más allá de eso, puede ser una cuestión de generar la lista usted mismo: haga un programa que declare una cadena literal para cada carácter /u0000
- lo que sea, y vea cuáles son las sentencias ldstr
compiladas. Si llego primero, me aseguraré de publicar mis resultados.
Notas adicionales:
Para analizar correctamente los literales de la cadena * IL, conocidos como QSTRINGS o SQSTRINGS, deberás tener en cuenta más que solo escapes de caracteres. Tome la concatenación de cadenas en el código, por ejemplo (y esto es literalmente de la Partición II :: 5.2):
El operador "+" se puede utilizar para concatenar literales de cadena. De esta manera, una cadena larga se puede dividir en varias líneas usando "+" y una cadena nueva en cada línea. Una alternativa es usar "/" como el último carácter de una línea, en cuyo caso, ese carácter y el salto de línea que lo sigue no se ingresan en la cadena generada. Se ignoran los caracteres de espacio en blanco (espacio, avance de línea, retorno de carro y tabulador) entre "/" y el primer carácter de espacio no blanco en la siguiente línea. [Nota: para incluir un carácter de comillas dobles en un QSTRING, use una secuencia de escape octal. nota final]
Ejemplo: el siguiente resultado en cadenas que son equivalentes a "Hello World from CIL!":
ldstr "Hello " + "World " + "from CIL!"
ldstr "Hello World/
/040from CIL!"
He escrito un programa (en C #) que lee y manipula programas MSIL que se han generado a partir de programas C #. Supuse erróneamente que las reglas de sintaxis para las constantes de cadena de MSIL son las mismas que para C #, pero luego me encontré con la siguiente situación:
Esta declaración de C #
string s = "Do you wish to send anyway?";
se compila en (entre otras declaraciones de MSIL) este
IL_0128: ldstr "Do you wish to send anyway/?"
No esperaba la barra invertida que se utiliza para escapar del signo de interrogación. Ahora, obviamente, puedo tomar en cuenta esta barra invertida como parte de mi procesamiento, pero sobre todo por curiosidad, me gustaría saber si hay una lista de qué caracteres se escapan cuando el compilador C # convierte las cadenas constantes C # en cadenas constantes MSIL.
Gracias.