2010-01-25 17 views

Respuesta

26

Una char es unicode en C#, por lo tanto, el número de caracteres posibles excede 255. Por lo tanto, necesitará dos bytes.

El ASCII extendido, por ejemplo, tiene un juego de 255 caracteres y, por lo tanto, se puede almacenar en un solo byte. Ese es también el propósito del espacio de nombre System.Encoding, ya que los diferentes sistemas pueden tener diferentes conjuntos de caracteres y tamaños de caracteres. C# por lo tanto puede manejar one/four/etc. char bytes, pero Unicode UTF-16 es el predeterminado.

+10

Con Unicode como código de 21 bits es un un poco exagerado para decir que es por eso que necesita dos bytes. – Joey

+2

Los charactores se representan utilizando UTF-16, lo que significa que cada carácter utiliza al menos 16 bits o 2 bytes (incluso los caracteres de ASCII que solo requieren 7 bits). Si el valor Unicode es lo suficientemente grande, un único carácter que se imprimiría en la pantalla realmente requerirá dos 'char's. – Cemafor

+2

La primera oración de esta respuesta ignora la existencia de caracteres de ancho variable. – kervin

0

Porque las cadenas en .NET están codificadas como caracteres de Unicode de 2 bytes.

+4

(a) Las cadenas son secuencias de caracteres. (b) No hay caracteres Unicode de 2 bytes. Puede estar buscando los términos * unidad de código * y * código de punto *. Y con este último, todavía no hay 16 bits, solo 21. – Joey

+2

UTF-8/16/32! = Unicode – Lucas

+0

Entonces, ¿cuál es la relación entre un carácter C# y un punto de código Unicode? – JohnM2

3

En realidad, C#, o más exactamente el CLR, el tamaño del carácter es coherente con la mayoría de los demás lenguajes administrados. Los lenguajes administrados, como Java, tienden a ser más nuevos y tienen elementos como el soporte Unicode integrado desde cero. La extensión natural de las cadenas Unicode compatibles es tener caracteres Unicode.

Los lenguajes antiguos como C/C++ comenzaron solo en ASCII y solo más tarde agregaron compatibilidad Unicode.

20

supongo con “otros lenguajes de programación” que significaría C. C tiene en realidad dos diferentes tipos: charchar y wchar_t. char puede ser de un byte de longitud, wchar_t no necesariamente.

En C# (y .NET) para el caso, todas las cadenas de caracteres están codificadas como Unicode en UTF-16. Es por eso que char en .NET representa una sola unidad de código UTF-16 que puede ser un punto de código o la mitad de un par suplente (en realidad no es un personaje, entonces).

+0

Referencia: https://docs.microsoft.com/en-us/dotnet/api/system.char?view=netframework-4.7 –

1

Porque un carácter en una cadena C# se establece de manera predeterminada en la codificación UTF-16 de Unicode, que es de 2 bytes (de forma predeterminada).

0

C# utilizando un ancho de caracteres de 16 bits probablemente tiene más que ver con el rendimiento que con cualquier otra cosa.

En primer lugar, si utiliza UTF-8 puede incluir todos los caracteres en la cantidad de espacio "correcta". Esto se debe a que UTF-8 es de ancho variable. Los caracteres ASCII usarán 8 bits, mientras que los caracteres más grandes usarán más.

Pero la codificación de caracteres de longitud variable alienta O (n) complejidad del algoritmo en escenarios comunes. P.ej. Recuperando un personaje en una ubicación particular en una cadena. Ha habido discusiones públicas sobre este punto. Pero la solución más simple es continuar utilizando un ancho de caracteres que se adapte a la mayoría de su juego de caracteres, truncando los otros. Ahora tiene un ancho de caracteres fijo.

Estrictamente hablando, UTF-16 también es una codificación de ancho variable, por lo que C# (y Java para el caso) están utilizando algo de un híbrido ya que sus anchos de caracteres nunca son de 32 bits.

+0

Yo votaría esto para el primero, segundo y último párrafo; pero lo votaría por el tercer párrafo. Sin embargo, sigue siendo mejor que las otras respuestas, incluida la respuesta principal/aceptada. PD tienes un error tipográfico: "Ahora ** es ** tienes un ancho de caracteres fijo". – hippietrail

+0

@hippietrail Tengo curiosidad, ¿qué pasa con el 3er párrafo que crees que es incorrecto? ¿Puedes obtener un personaje en una ubicación específica en una cadena de caracteres de ancho variable utilizando mejor que O (n)? – kervin

+0

Porque argumenta que la razón era tener codificación de longitud fija en escenarios comunes. Los escenarios legítimos para tratar el texto como longitud fija son pocos. Los comunes son solo juguetes, ignorantes y miopes que inevitablemente conducen a errores. Los desarrolladores de C# no solo lo sabían, sino que el desarrollo de C# solo se inició tres años después de que Unicode avanzara más allá de 16 bits y Microsoft fue un miembro clave del consorcio Unicode todo el tiempo. Ahora bien, estos fueron sin duda factores en la decisión de UCS-2 para Java y Windows NT, pero para C# las razones solo pueden haber sido legado y momentum. – hippietrail

Cuestiones relacionadas