2010-08-07 18 views
5

Estoy tratando de convertir una secuencia de bytes con MultiByteToWideChar() función WinAPI.Cómo convertir una secuencia de bytes a otra codificación?

La documentación dice que la función falla con ERROR_NO_UNICODE_TRANSLATION en cadenas incompletas (sin bytes finales en cadenas codificadas en varios bytes). ¿Cómo evito este error? La única manera que viene a la mente es no convertir el último carácter multibyte del buffer de entrada (usando IsDBCSLeadByteEx() para localizarlo).

¿Hay mejores soluciones para convertir una secuencia de bytes?

+0

¿Qué página de códigos utiliza? ¿En qué forma recibe los datos? Espero desde el principio hasta el final y no al revés. – Oleg

+0

El código debería funcionar con todas las páginas de códigos admitidas por las plataformas de Windows. Recibo los datos en codificación multibyte o singlebyte y quiero procesarlo internamente en forma amplia, convirtiéndolo a codificación específica del entorno en la salida (después del procesamiento). – Basilevs

Respuesta

2

Me parece que puede usar CharNextExA para pasar a la siguiente posición del carácter en la secuencia de entrada. En la forma en que puede obtener algunos caracteres y convertirlos allí juntos en la cadena UNICODE con respecto de MultiByteToWideChar. Después de tener el fragmento de texto UNICODE, puede convertirlo en otra página de códigos usando WideCharToMultiByte.

ACTUALIZADO: Estoy seguro de que el proceso de recibir la corriente de los datos de entrada es mucho más lentamente a medida que la decodificación de los datos con respecto a CharNextExA, MultiByteToWideChar y WideCharToMultiByte. Por ejemplo, si usa un búfer en la pila como WCHAR szBuffer[4096] y TCHAR szDestBuffer[4096], podrá decodificar 1K de datos de entrada muy rápidamente. Así que supongo que el tiempo total de funcionamiento de su programa completo estará casi sangrado por el uso de estas tres funciones.

Además, no estoy seguro de que tenga otra alternativa. No conozco ninguna forma confiable de comenzar a decodificar el texto desde el principio hasta el final del texto. Probablemente otras personas tengan otra idea ...

+0

Necesito un enfoque más eficiente: los fragmentos de datos son muy grandes y no quiero llamar a la función para cada símbolo. ¿Hay alguna forma de reducir una cantidad de llamadas? – Basilevs

+1

Me parece que de otra manera es imposible si desea admitir todas las páginas de códigos compatibles con las plataformas de Windows. En la documentación de 'IsDBCSLeadByteEx' puede leer:" Los valores de los bytes de derivación son específicos para cada DBCS distinto. Algunos valores de bytes pueden aparecer en una sola página de códigos como el byte principal y de ruta de un carácter DBCS. Por lo tanto, IsDBCSLeadByteEx solo puede indicar un posible valor de byte principal ". Entonces, la exploración secuencial de datos con 'CharNextExA' parece la única manera segura. Simplemente verifique si va a completar los cambios de rendimiento del uso de 'CharNextExA'. Es rápido 'CharPrevExA' es lento – Oleg

+1

Está analizando una cola de 10 bytes al final de un búfer de 10000 bytes con CharPrevExA() más lento que el procesamiento de todo el búfer con CharNextExA()? ¿Funcionará correctamente CharPrevExA con un carácter medio como argumento lpCurrentChar? – Basilevs

Cuestiones relacionadas