2011-05-03 9 views
18

He hecho muy poco con la codificación de texto. A decir verdad, realmente ni siquiera sé lo que significa exactamente.Descripción de la codificación de texto (en .Net)

Por ejemplo, si tengo algo como:

Dim myStr as String = "Hello" 

es que 'codifica' en la memoria en un formato particular? ¿Ese formato depende del idioma que estoy usando?

Si estuviera en otro país, como China, por ejemplo, y tuviera una serie de chino (¿mandarín? Mis disculpas si estoy usando las palabras equivocadas aquí) sería el siguiente código (que he usado bien en las cuerdas en inglés) ¿todavía funciona igual?

System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); 
return encoding.GetBytes(str); 

O sería perder todo significado al convertir esa cadena .Net a un UTF8Encoding cuando esa conversión no es válida?

Finalmente, he trabajado con .Net desde hace unos años y nunca he visto, escuchado o tenido que hacer nada con Encoding. ¿Soy la excepción, o no es algo común que hacer?

+3

buena pregunta ... Muchos desarrolladores luchan con esto, en mi experiencia. – jeroenh

Respuesta

25

La clase de cadena .NET está codificando cadenas usando UTF16 - eso significa 2 bytes por carácter (aunque permite combinaciones especiales de dos caracteres para formar un solo carácter de 4 bytes, llamados "pares sustitutos").

UTF8 Por otro lado, utilizará un número variable de bytes necesarios para representar un carácter Unicode particular, es decir, solo un byte para caracteres ASCII normales, pero quizás 3 bytes para un carácter chino. Ambas codificaciones permiten representar todos los caracteres Unicode, por lo que siempre hay una asignación entre ellos: ambas son representaciones binarias diferentes (es decir, para almacenar en la memoria o en el disco) del mismo juego de caracteres (unicode).

Dado que no todos los caracteres Unicode podían caber en los 2 bytes originales reservados por UTF-16, el formato también permite denotar una combinación de dos caracteres UTF-16 para formar 4 caracteres de bytes: se llama el carácter así formado un "sustituto" o par suplente y es un par de valores de codificación Unicode de 16 bits que, juntos, representan un solo carácter.

UTF-8 no tiene este problema, ya que el número de bytes por carácter Unicode no es fijo. Se puede obtener una buena descripción general sobre UTF-8, UTF-16 y BOMs here.

Una excelente visión general/introducción a la codificación de caracteres Unicode es The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

+0

Gracias por ese enlace (y el resto de su respuesta) –

+0

artículo impresionante !! ("The Absolute Minimum ...") Pensé que entendía bien y todavía aprendí algo. ¡Léelo! –

1

UTF es un tipo específico de codificación con múltiples tamaños diferentes. Cada tipo de codificación es la cantidad de memoria y qué representación en esa memoria tomarán los personajes.

Generalmente trabajamos con Unicode y Ascii.

Unicode tiene 2 bytes por caracter.
Ascii es de 1 Byte por carácter.

Ascii se puede representar en unicode. sin embargo, Unicode no se puede representar en ascii sin estar codificado.

La codificación UTF utiliza un carácter especial '%' para indicarle que el siguiente es el valor hexadecimal de un carácter codificado.

% 20 por ejemplo es el personaje 32, que en realidad es un espacio.

http://www.google.com?q=space%20character 

colocar esa URL en un navegador sería UTF-8 decodificación de esta cadena y q = realidad serían interpretadas como "carácter de espacio" nota el 20% es ahora un espacio.

UTF-16 utiliza 2 bytes y se representa como tal.

http://www.google.com?q=space%0020character 

este ejemplo sería en realidad un error como el URI es en realidad supone utilizar UTF-8, pero este ejemplo demuestra el punto.

El carácter Unicode sería 0020 o dos bytes con los valores 0 y 32 respectivamente.

El mandarín sería algún tipo de caracteres Unicode, y UTF-16 codificaría el Unicode para que fuera representable en Ascii.

Aquí es un artículo de wiki explicar un poco más en profundidad

http://en.wikipedia.org/wiki/UTF-8

9

Primero y foremeost: no se desespere, usted no está solo. La conciencia del tratamiento de la codificación de caracteres y la representación de texto en general es una cosa desafortunadamente poco común, ¡pero no hay mejor momento para comenzar a aprender que ahora mismo!

En los sistemas modernos, incluido .NET, las cadenas de texto se representan en la memoria mediante alguna codificación de Unicode code points. Estos son solo números. El punto de código para el carácter A es 65. El punto de código para el copyright (c) es 169. El punto de código para el dígito tailandés seis es 3670.

El término "codificación" se refiere a cómo se representan estos números en la memoria. Hay una serie de codificaciones estándar que se utilizan para que la representación textual pueda permanecer constante a medida que los datos se transmiten de un sistema a otro.

Un estándar de codificación simple es UCS-2, donde el punto de código se almacena en bruto como una palabra de 16 bits. Esto es limitado debido al hecho de que solo puede representar los puntos de código 0000-FFFF y dicho rango no cubre toda la amplitud de los puntos de código Unicode.

UTF-16 es la codificación utilizada internamente por la clase .NET String. La mayoría de los caracteres caben en una sola palabra de 16 bits aquí, pero los valores más grandes que FFFF están codificados usando pares sustitutos (ver el Wiki). Debido a este esquema de codificación, los puntos de código D800-DFFF no pueden ser censurados por UTF-16.

UTF-8 es quizás la codificación más utilizada hoy en día, por varias razones que se describen en el artículo de Wiki.

Cuestiones relacionadas