2011-01-28 15 views
5

Este es un tiro en la oscuridad, y me disculpo de antemano si esta pregunta suena como las divagaciones de un loco.C#, UTF-8 y caracteres de codificación

Como parte de una integración con un tercero, necesito UTF8-codificar cierta información de cadena utilizando C# para poder enviarla al servidor de destino a través de una forma multiparte. El problema es que están rechazando algunos de mis envíos, probablemente porque no estoy codificando sus contenidos correctamente.

En este momento, estoy tratando de ver cómo un guion o guión - no puedo decir cuál es simplemente al mirarlo - es recibido o interpretado por el servidor de destino como [email protected]~S (sí, eso es una cadena de 5 caracteres y no es su navegador glitching). Y desafortunadamente no tengo una comprensión lo suficientemente exhaustiva de Encoding.UTF8.GetBytes() para saber cómo usar la matriz de bytes para comenzar a identificar dónde podría estar el problema.

Si alguien puede proporcionar algún consejo o sugerencia, lo agradecería mucho. Hasta ahora, mi único amigo ha sido MSDN, y no mucho de uno en eso.

ACTUALIZACIÓN 1: Después de un poco más de excavación alrededor, he descubierto que el uso de System.Web.HttpUtility.UrlEncode() para codificar un carácter DASH EM ("-") se HEX-encode en "% e2% 80% 94".

Actualmente estoy enviando esta información en un mensaje de HttpWebRequest, con contenido de "application/x-www-form-urlencoded" - ¿Esto podría estar causando el problema? Y si es así, ¿cuál es la forma correcta de codificar una serie de pares de nombre-valor cuyos valores pueden contener caracteres Unicode, de forma que un servidor que lo espera comprenda una solicitud UTF-8?

+0

A partir de ese resultado, supongo que podría estar codificando ascii el resultado de la codificación utf8 de un em dash. – Joshua

+0

Incluso con la codificación incorrecta, es muy poco probable que un guión de 1 carácter se traduzca en una secuencia de 5 caracteres. Probablemente no sea solo un problema de codificación. –

+0

@Joshua: Creo que estás cerca del corazón del problema. Acabo de agregar una actualización a mi publicación original con más información. –

Respuesta

3
byte[] test = System.Text.Encoding.UTF8.GetBytes("-"); 

debe darle

test[0] = 0x2D (45 as integer). 

verificar que su envío 0x2D al servidor de destino.

+1

Wireshark es útil para este tipo de cosas – Marlon

+0

Nunca antes había usado Wireshark, pero nuestro desarrollador principal tiene mucha experiencia con Fiddler. Le daré una oportunidad tan pronto como regrese a la oficina, gracias por la sugerencia. –

+0

Wireshark es muy simple de configurar. Le permite ver qué paquetes están llegando a su servidor. Puede filtrar los datos de muchas maneras para que no pierda los datos. – Chauncat

1

Es posible que deba agregar un parámetro "charset = utf-8" a su encabezado de tipo de contenido. Es posible que también desee tener un encabezado Content-Encoding para establecer su codificación. Los encabezados deben contener lo siguiente:

Content-Type: multipart/form-data; charset = utf-8

De lo contrario, el servidor web no sabrá que sus bytes son bytes UTF-8, por lo que los malinterpretará.

+0

Tiene razón en que actualmente no estoy definiendo explícitamente un tipo de codificación de contenido cuando envío el formulario multiparte. Acabo de enviar un correo electrónico a un tercero, preguntándole si sabían cuál era el tipo de contenido esperado predeterminado: ¿es algo que podrían identificar fácilmente? Creo que están ejecutando servidores de Microsoft (IIS). –

+0

'UTF-8' es [no es un valor' Content-Encoding' válido] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11). Ese encabezado se usa para indicar cómo se comprime la carga útil. No se utiliza para indicar el juego de caracteres. – dkarp

+0

@dkarp tiene razón. – Jacob

Cuestiones relacionadas