2009-07-12 8 views
13

Actualmente estoy explorando la especificación del lenguaje Digital Mars D, y estoy teniendo problemas para entender la naturaleza completa de los tipos de caracteres primitivos. El libro Learn to Tango With D es igualmente vago sobre las capacidades y limitaciones del lenguaje en esta área.¿Cuáles son las limitaciones de los tipos de caracteres primitivos en D?

Los tipos se dan en the website como:

 
char; // unsinged 8 bit UTF-8 
wchar; // unsigned 16 bit UTF-16 
dchar; // unsigned 32 bit UTF-32 

Ya que sabemos que la mayor parte de la Transformación Unicode (UTF) codificaciones Formato representan personajes con un bit de ancho variable, ¿significa esto que un char en D solo puede contener los valores que caben en 8 bits, o se expande en la memoria física de la máquina cuando le das caracteres de doble byte? Tal vez haya alguna otra posibilidad, como la conversión automática en el siguiente tipo más apropiado a medida que sobrecarga la variable.

Digamos, por ejemplo, que quiero usar el carácter UTF-8 en un editor y escribir en chino. ¿Simplemente se caerá, o es capaz de manejar los caracteres Unicode más 'correctamente', como en C#? ¿Sería necesario proporcionar código de pegamento para permitir trabajar con cualquier idioma admitido por Unicode?

Agradecería cualquier información específica que pueda ofrecer sobre cómo funcionan estos tipos bajo las coberturas, y cualquier consejo general de mejores prácticas para hacer frente a sus limitaciones.

+0

"Dado que sabemos que el estándar Unicode representa caracteres con un bit de ancho variable "-> ¿te refieres a utf8? – elcuco

+0

Sí, me refiero a las codificaciones UFT. Perdón por la confusion. – IanGilham

Respuesta

15

Un solo char o wchar representa un UTF code unit. Esto significa que, por sí solo, un char en puede representar un símbolo ASCII (0-127) o ser parte de una secuencia UTF-8 que representa un carácter Unicode (code point). Solo el tipo dchar puede representar un carácter Unicode completo, porque hay más de 65536 puntos de código en Unicode.

casting un tipo de tipo de cadena (string, wstring y dstring, que son simplemente matrices dinámicas de los tipos de caracteres) no convertirá automáticamente sus contenidos a la representación UTF respectiva. Con el fin de hacer esto, debe utilizar las funciones toUTF8, y toUTF16toUTF32 de std.utf (o toString/toString16/toString32 de tango.text.convert.Utf si utiliza Tango).

Los usuarios han implementado clases de cadenas que utilizarán automáticamente la representación más eficiente de la memoria que puede asignar cada carácter a una unidad de código individual. Esto permite cortar e indexar rápidamente con una sobrecarga de memoria mínima. Una de estas implementaciones es mtext por Christopher E. Miller.

Más información:

+2

Parece que mi problema fue comprender la diferencia entre las unidades de código y los puntos de código. El último enlace explica todo muy bien. Gracias. – IanGilham

+0

Lo mismo con el complemento para la escritura del Sr. Keep. – BCS

+1

Me complace escuchar que el artículo te ayudó. Aún así, te maldigo, CyberShadow, por responder a esto antes de llegar aquí. :PAG –

Cuestiones relacionadas