Cómo convertir bytes UTF-8 [] a cadena
Tengo una byte[]
matriz que se carga desde un archivo que sé que contiene UTF-8 .
En algún código de depuración, necesito convertirlo en una cadena. ¿Existe alguna frase ingeniosa que haga esto?
Debajo de las sábanas debería haber solo una asignación y una copia de memoria , por lo que incluso si no se implementa, debería ser posible.
string result = System.Text.Encoding.UTF8.GetString(byteArray);
o uno de los de sobrecarga si conoces la longitud:
string result = System.Text.Encoding.UTF8.GetString(byteArray, 0, 42);
Hay al menos cuatro formas diferentes de realizar esta conversión.
GetString de codificación
, pero no podrá recuperar los bytes originales si esos bytes tienen caracteres que no son ASCII.BitConverter.ToString
La salida es una cadena delimitada por "-", pero no existe ningún método integrado de .NET para convertir la cadena nuevamente en una matriz de bytes.Convert.ToBase64String
Puede convertir fácilmente la cadena de salida a una matriz de bytes usandoConvert.FromBase64String
.
Nota: La cadena de salida podría contener '+', '/' y '='. Si desea utilizar la cadena en una URL, debe codificarla explícitamente.HttpServerUtility.UrlTokenEncode
Puede convertir fácilmente la cadena de salida a una matriz de bytes usandoHttpServerUtility.UrlTokenDecode
. ¡La cadena de salida ya es compatible con URL! La desventaja es que necesitaSystem.Web
montaje si su proyecto no es un proyecto web.
Un ejemplo completo:
byte[] bytes = { 130, 200, 234, 23 }; // A byte array contains non-ASCII (or non-readable) characters
string s1 = Encoding.UTF8.GetString(bytes); // ���
byte[] decBytes1 = Encoding.UTF8.GetBytes(s1); // decBytes1.Length == 10 !!
// decBytes1 not same as bytes
// Using UTF-8 or other Encoding object will get similar results
string s2 = BitConverter.ToString(bytes); // 82-C8-EA-17
String[] tempAry = s2.Split('-');
byte[] decBytes2 = new byte[tempAry.Length];
for (int i = 0; i < tempAry.Length; i++)
decBytes2[i] = Convert.ToByte(tempAry[i], 16);
// decBytes2 same as bytes
string s3 = Convert.ToBase64String(bytes); // gsjqFw==
byte[] decByte3 = Convert.FromBase64String(s3);
// decByte3 same as bytes
string s4 = HttpServerUtility.UrlTokenEncode(bytes); // gsjqFw2
byte[] decBytes4 = HttpServerUtility.UrlTokenDecode(s4);
// decBytes4 same as bytes
Una solución general para convertir de una matriz de bytes a una cadena cuando no conoce la codificación:
static string BytesToStringConverted(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
using (var streamReader = new StreamReader(stream))
{
return streamReader.ReadToEnd();
}
}
}
Definición:
public static string ConvertByteToString(this byte[] source)
{
return source != null ? System.Text.Encoding.UTF8.GetString(source) : null;
}
Usando:
string result = input.ConvertByteToString();
Vi algunas respuestas en esta publicación y es posible considerarlo un conocimiento básico completo, porque tengo varios enfoques en programación C# para resolver el mismo problema. Lo único que es necesario tener en cuenta es la diferencia entre UTF-8 puro y UTF-8 con una lista de materiales .
La semana pasada, en mi trabajo, necesitaba desarrollar una funcionalidad que generara archivos CSV con una BOM y otros archivos CSV con UTF-8 puro (sin una BOM). Cada tipo de codificación de archivo CSV será consumido por diferentes API no estandarizadas. Una API lee UTF-8 con una BOM y la otra API lee sin una BOM. Necesitaba investigar las referencias sobre este concepto, leyendo la pregunta de desbordamiento de pila "¿ Cuál es la diferencia entre UTF-8 y UTF-8 sin BOM? " y el artículo de Wikipedia " Marca de orden de bytes " para desarrollar mi enfoque.
Finalmente, mi programación en C# para ambos tipos de codificación UTF-8 (con BOM y pura) debía ser similar al siguiente ejemplo:
// For UTF-8 with BOM, equals shared by Zanoni (at top)
string result = System.Text.Encoding.UTF8.GetString(byteArray);
//for Pure UTF-8 (without B.O.M.)
string result = (new UTF8Encoding(false)).GetString(byteArray);