Estoy escribiendo valores enteros en un archivo de Kotlin (tipo Kotlin Int) usando algo como esto
var1BufferedWriter?.write(String.format("%d\n", intvar ) )
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )
var1
lo anterior se escribe en textfile.txt
y var2
en textfile_hex.txt
. Ambos se guardan en la memoria de la tarjeta SD del teléfono Android. Cuando los copio en una PC con Windows y los abro en el Bloc de notas, textfile.txt se ve así
mientras que textfile_hex.txt se ve así:
Si abro textfile.txt en un editor hexadecimal, puedo ver que todos los datos del archivo son correctos y lo que espero que estén allí. Notepad++ también muestra todo correctamente. Lo extraño es que usé esta misma aplicación antes del fin de semana para generar muchos otros archivos similares a textfile.txt y todos parecían normales en Windows. No se ha cambiado nada en la configuración de Android o del Bloc de notas.
¿Es este comportamiento normal? ¿Es esto algún tipo de problema de codificación? ¿Por qué el Bloc de notas muestra algunos archivos de texto correctamente y otros no?
Versión de Windows:
Edición Windows 10 Pro
Versión 22H2
Compilación del sistema operativo 19045.4046
Experiencia Paquete de experiencia de características de Windows 1000.19053.1000.0
Respuesta1
El archivo desencadena unfalso positivoen la detección "Es Unicode" del Bloc de notas. (El problema incluso tienesu propia página de Wikipedia.)
Si su 'intvar' es siempre cero, entonces el archivo consta enteramente de archivos repetidos
"0\n"
, que se almacenan como bytes{0x30, 0x0A}
en ASCII (y/o en UTF-8)."0" "\n" "0" "\n" "0" "\n" ... 30 0A 30 0A 30 0A ...
Estás viendo el carácter Unicode,
"ਰ"
también conocido"\u0A30"
como alias.U+0A30, cual estambiénalmacenado como bytes{0x30, 0x0A}
en UTF-16 LE."ਰ" "ਰ" "ਰ" ... 30 0A 30 0A 30 0A ...
Modificar un poco la salida (por ejemplo, agregar algún tipo de encabezado o comentario "obviamente ASCII") solucionaría el problema.
También puede anteponer el contenido del archivo "\xEF\xBB\xBF"
(o "\uFEFF"
, como prefiera la ortografía Java/Kotlin), que es el encabezado estándar para indicar que un archivo es UTF-8 y haría que el Bloc de notas (y todos los demás editores de texto) omitan la detección automática.
Si Android lo admite, puede hacer que escriba el archivo comoactualUTF-16 (preferiblemente con BOM incluida, para omitir esta parte de la detección de formato).
(Sus otros archivos probablemente no desencadenan el problema porque tienen al menos un valor ≥10, lo que "desalinea" los bytes para que se parezcan un poco más a ASCII y un poco menos a UTF-16 según el código de detección).