En nuestro equipo tenemos un proyecto de base de datos en Visual Studio 2008 que está bajo control de fuente por Team Foundation Server. Cada dos semanas más o menos, después de que un compañero de trabajo se registra, el archivo del proyecto no se cargará en las otras máquinas de desarrollo. El mensaje de error es:El archivo de proyecto de Visual Studio 2008 no se carga debido a un cambio de codificación inesperado
el archivo de proyecto no se pudo cargar. Los datos a nivel de la raíz no es válida. Línea 1, posición 1.
Cuando miro el archivo de proyecto de Notepad ++, el archivo tiene el siguiente aspecto:
��<NUL?NULxNULmNULlNUL NULvNULeNULrNULsNULiNULoNULnNUL
...
y así sucesivamente (se puede ver en este <?xml version
) mientras que un archivo normal de proyecto se ve como:
<?xml version="1.0" encoding="utf-16"?>
...
Así que probablemente algo está mal en el enc oding del archivo. Este es un problema para nosotros porque resulta imposible volver a corregir la codificación del archivo. La 'solución' es tirar el archivo del proyecto y obtener la última versión de trabajo conocida del control de fuente.
Según el archivo, la codificación debe ser UTF-16. Según Notepad ++, el archivo dañado es en realidad UTF-8.
Mis preguntas son:
- ¿Por qué Visual Studio echar a perder la codificación del archivo proyecto, aparentemente de forma aleatoria y al azar máquinas?
- ¿Qué deberíamos hacer para prevenir esto?
- Cuando ha sucedido, ¿existe la posibilidad para restaurar el archivo actual en la codificación correcta en vez de tirar una versión más antigua de control de código fuente?
Como última nota: el problema es con un único archivo de proyecto, el resto de los archivos de proyecto no exponen este problema.
ACTUALIZACIÓN: Gracias a la sugerencia de Jon Skeet tengo la respuesta a la pregunta número tres. Cuando reemplazo los primeros nueve bytes EF BB BF EF BF BD EF BF BD por los dos bytes FF FE, el archivo de proyecto se cargará nuevamente.
Esto deja la pregunta por qué Visual Studio corrompe el archivo.
¿Qué ves si haces una diferencia binaria entre archivos rotos y que funcionan? Me pregunto si es un problema de endianness UTF-16. –
Si hago un diff binario, resulta que los archivos son idénticos, excepto que el correcto tiene dos bytes adicionales al principio, FF FE, y el corrupto tenía nueve bytes adicionales EF BB BF EF BF BD EF BF BD. – Xenan