simbolos - Soporte Unicode en varios lenguajes de programación
unicode simbolos (20)
Me gustaría tener un lugar canónico para reunir información sobre el soporte de Unicode en varios idiomas. ¿Es parte del lenguaje central? ¿Se proporciona en las bibliotecas? ¿No está disponible en absoluto? ¿Existe un recurso popular recurso para la información Unicode en un idioma? Un idioma por respuesta, por favor. Además, si pudiera convertir el idioma en un encabezado que lo haría más fácil de encontrar.
.NET (C #, VB.NET, ...)
.NET almacena strings internamente como una secuencia de objetos System.Char
. One System.Char
representa una unidad de código UTF-16.
De la documentación de MSDN en System.Char
:
.NET Framework usa la estructura Char para representar un carácter Unicode. El estándar Unicode identifica cada carácter Unicode con un número escalar único de 21 bits llamado punto de código, y define el formulario de codificación UTF-16 que especifica cómo se codifica un punto de código en una secuencia de uno o más valores de 16 bits. Cada valor de 16 bits varía de hexadecimal 0x0000 a 0xFFFF y se almacena en una estructura Char .
Recursos adicionales:
- Cadenas en .NET y C # (por Jon Skeet).
C / C ++
do
C antes de C99 no tiene compatibilidad integrada con Unicode. Utiliza matrices de caracteres terminadas en cero ( char*
o char[]
) como cadenas. Un char
está especificado por un byte (8 bits).
C99 especifica las funciones wcs
en adiciones a las antiguas funciones str
(por ejemplo, strlen
-> wcslen
). Estas funciones toman wchar_t*
lugar de char*
. wchar_t
significa tipo de carácter ancho. El tamaño de wchar_t
es específico del compilador y puede ser tan pequeño como 8 bits. Si bien los diferentes compiladores usan tamaños diferentes, por lo general son 16 bits (UTF-16) o 32 bits (UTF-32).
La mayoría de las funciones de la biblioteca C son transparentes para UTF-8. Por ejemplo, si su sistema operativo es compatible con UTF-8 (y UTF-8 está configurado como conjunto de caracteres de su sistema), la creación de un archivo utilizando fopen
pasando una cadena codificada en UTF-8 creará un archivo con el nombre adecuado.
C ++
La situación en C ++ es muy similar ( std::string
-> std::wstring
), pero al menos hay esfuerzos para obtener algún tipo de soporte Unicode en la biblioteca estándar .
C objetivo
Ninguna incorporada, aparte de lo que sucede que esté disponible como parte de la biblioteca de cadenas C.
Sin embargo, una vez que agregue marcos ...
Fundación (Cocoa y Cocoa Touch) y Core Foundation
NSString y CFString implementan una clase de cadena totalmente basada en Unicode (en realidad varias clases, como un detalle de implementación). Los dos son "gratuitos", de modo que la API para uno se puede usar con instancias de la otra, y viceversa.
Para datos que no necesariamente representan texto, hay NSData y CFData. NSString proporciona métodos y CFString proporciona funciones para codificar texto en datos y descodificar texto de datos. Core Foundation admite más de cien codificaciones diferentes, incluidas todas las formas de los UTF. Las codificaciones se dividen en dos grupos: codificaciones incorporadas , que son compatibles en todas partes, y codificaciones externas , que son al menos compatibles con Mac OS X.
NSString proporciona métodos para normalizar los formularios D, KD, C o KC. Cada uno devuelve una nueva cadena.
Tanto NSString como CFString proporcionan una amplia variedad de opciones de comparación / intercalación. Aquí están los indicadores de opción de comparación de Foundation y los indicadores de opción de comparación de Core Foundation . No son todos sinónimos; por ejemplo, Core Foundation hace que la comparación literal (basada estrictamente en el punto de código) sea la predeterminada, mientras que Foundation hace una comparación no literal (que permite que los caracteres con acentos se igualen) por defecto.
Tenga en cuenta que Core Foundation no requiere Objective-C; de hecho, fue creado para proporcionar la mayoría de las características de los programadores de Foundation to Carbon, que usaron C o C ++ directamente. Sin embargo, sospecho que su uso más moderno está en los programas Cocoa o Cocoa Touch, todos escritos en Objective-C u Objective-C ++.
Delphi
Delphi 2009 es totalmente compatible con Unicode. Han cambiado la implementación de la string
por defecto a la codificación Unicode de 16 bits, y la mayoría de las bibliotecas, incluidas las de terceros, son compatibles con Unicode. Ver Delphi y Unicode de Marco Cantù.
Antes de Delphi 2009, el soporte para Unicode era limitado, pero WideChar
y WideString
almacenaban la cadena codificada de 16 bits. Ver Unicode en Delphi para más información.
Tenga en cuenta que aún puede desarrollar una aplicación CJKV bilingüe sin usar Unicode. Por ejemplo, la cadena Shift JIS codificada para japonés se puede almacenar utilizando AnsiString
simple.
HQ9 +
El comando Q tiene soporte completo Unicode en la mayoría de las implementaciones.
Java
Al igual que con .NET, Java usa UTF-16 internamente: java.lang.String
Una
String
representa una cadena en el formato UTF-16 en la que los caracteres suplementarios están representados por pares de sustitución (consulte la sección Representaciones de Caracteres Unicode en la clase deCharacter
para obtener más información). Los valores de índice se refieren a unidades de código dechar
, por lo que un carácter suplementario utiliza dos posiciones en unaString
.
JavaScript
Parece que antes de JS 1.3 no había soporte para Unicode. Desde 1.5, UTF-8, UTF-16 y UCS-2 son compatibles. Puede usar secuencias de escape Unicode en cadenas, expresiones regulares e identificadores. Source
PHP
¡Ya hay un hilo completo sobre esto en SO!
Perl
Perl tiene soporte integrado para Unicode, principalmente. Más o menos De perldoc:
- perlunitut - Tutorial sobre el uso de Unicode en Perl. En gran parte enseña en términos absolutos sobre lo que debe y no debe hacer en cuanto a Unicode. Cubre lo básico.
- perlunifaq - Preguntas frecuentes sobre Unicode en Perl.
- perluniintro - Introducción a Unicode en Perl. Menos "predicación" que perlunitut .
- perlunicode - Para cuando absolutamente tienes que saber todo lo que hay que saber sobre Unicode y Perl.
Pitón
Python 2 tiene las clases str
y unicode
. str
objetos str
almacenan bytes, los objetos unicode
almacenan caracteres UTF-16. La mayoría de las funciones de la biblioteca son compatibles con ambas (por ejemplo, os.listdir(''.'')
Devuelve una lista de str
, os.listdir(u''.'')
Devuelve una lista de objetos unicode
). Ambos tienen métodos de encode
y decode
.
Python 3 básicamente renombrado como unicode
a str
. El Python 3 equivalente a str
sería el tipo bytes
. bytes
tiene un método de decode
y str
un encode
. Dado que los objetos Python 3.3 str
internamente utilizan una de varias codificaciones para ahorrar memoria. Para un programador de Python, todavía se ve como una secuencia abstracta de Unicode.
Python admite:
- decodificación de codificación
- normalización
- conversión de caso simple y división en espacios en blanco
- buscando personajes por su nombre
Python no es compatible / tiene soporte limitado para:
- colación (limitada)
- conversiones de casos especiales donde no hay una correspondencia 1: 1 entre caracteres en mayúscula y minúscula
- expresiones regulares ( se trabajó en )
- segmentación de texto
- manejo de texto bidireccional
Ver también: La verdad sobre Unicode en Python
Rubí
Lo único que puedo encontrar para Ruby es bastante viejo y no me gusta mucho, no estoy seguro de lo preciso que es.
Para el registro, Ruby admite utf8, pero no multibyte. Internamente, normalmente se supone que las cadenas son vectores de bytes, aunque hay bibliotecas y trucos que generalmente se pueden usar para hacer que las cosas funcionen.
Encontrado eso here .
Ruby 1.9
Ruby 1.9 une codificaciones a cadenas. Las cadenas binarias usan la codificación "ASCII-8BIT". Si bien la codificación predeterminada suele ser UTF-8 en cualquier sistema moderno, no se puede asumir que todas las funciones de la biblioteca de terceros siempre devuelven cadenas en esta codificación. Puede devolver cualquier otra codificación (por ejemplo, algunos analizadores de yaml hacen eso en algunas situaciones). Si concatena dos cadenas de codificación diferente, puede obtener una Encoding::CompatibilityError
.
Tcl
Las cadenas Tcl han sido secuencias de caracteres Unicode desde Tcl 8.1 (1999). Internamente, se transforman dinámicamente entre UTF-8 (estrictamente el mismo UTF-8 modificado que Java debido al manejo de caracteres U+00000
) y UCS-2 (en endianness del host y BOM, por supuesto). Todas las cadenas externas (con una excepción), incluidas las utilizadas para comunicarse con el sistema operativo, son internamente Unicode antes de transformarse en la codificación que se requiere para el host (o se configura manualmente en un canal de comunicaciones). La excepción es para donde se copian los datos entre dos canales de comunicación con una codificación común (y algunas otras restricciones no relacionadas aquí) donde se utiliza una transferencia binaria directa sin copia.
Los caracteres fuera del BMP no se manejan actualmente ni interna ni externamente. Este es un problema conocido.
Ir
El lenguaje de programación Go de Google admite Unicode y funciona con UTF-8.
Lua
Lua 5.3 tiene una biblioteca utf8
, que maneja la codificación UTF-8. Le permite convertir una serie de puntos de código en la secuencia de bytes correspondiente y al revés, obtener la longitud (el número de puntos de código en una cadena), iterar sobre los puntos de código en una cadena, obtener la posición de bytes del n ° punto de código . También proporciona un patrón, para ser utilizado por las funciones de coincidencia de patrones en la biblioteca de string
, que coincidirá con una secuencia de bytes UTF-8.
Lua 5.3 tiene secuencias de escape de punto de código Unicode que se pueden usar en literales de cadena (por ejemplo, "/u{61}"
para "a"
). Se traducen en secuencias de bytes UTF-8.
El código fuente de Lua puede codificarse en UTF-8 o cualquier codificación en la que los caracteres ASCII ocupen un byte. UTF-16 y UTF-32 no son entendidos por el intérprete de Lua vanilla. Pero las cadenas pueden contener cualquier codificación o datos binarios arbitrarios.
Moho
Las cadenas de Rust ( std::String
y &str
) son siempre UTF-8 válidas, y no usan terminadores nulos, y como resultado no se pueden indexar como una matriz, como pueden ser en C / C ++, etc. Pueden ser rebanada algo así como Ir usando .get
desde 1.20, con la advertencia de que fallará si intenta cortar el centro de un punto de código.
Rust también tiene OsStr
/ OsString
para interactuar con el sistema operativo host. Es una matriz de bytes en Unix (que contiene cualquier secuencia de bytes). En Windows es WTF-8 (Un superconjunto de UTF-8 que maneja las cadenas Unicode formadas incorrectamente que están permitidas en Windows y Javascript), &str
y String
se pueden convertir libremente a OsStr
u OsString
, pero requieren controles para encubrir el otro camino. Ya sea mediante la falla en unicode no válido o el reemplazo con el carácter de reemplazo Unicode. (También hay Path
/ PathBuf
, que son solo envoltorios alrededor de OsStr
/ OsString
).
También están los tipos CStr
y CString
, que representan cadenas C terminadas nulas, como OsStr
en Unix, que pueden contener bytes arbitrarios.
Rust no es compatible directamente con UTF-16. Pero puede convertir OsStr
a UCS-2 en Windows.
Python 3k
Python 3k (o 3.0 o 3000) tiene un nuevo enfoque para manejar texto (unicode) y datos:
Texto vs. Datos en lugar de Unicode vs. 8 bits Ver también CÓMO Unicode .
re
D es compatible con UTF-8, UTF-16 y UTF-32 (char, wchar y dchar, respectivamente). La tabla con todos los tipos se puede encontrar here .
Esquema R6RS
Requiere la implementación de Unicode 5.1. Todas las cadenas están en ''formato Unicode''.