Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

unexpand: final newline prevents conversion of leading Unicode blanks

Abierto Apto para principiantes
#15,898 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@Ybucaille ya está trabajando en esto.

Desde el 27/10/2026.

  • #15925 de @Ybucaille — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
86/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
rust
Área
cli

Línea de trabajo

Empieza en src/uu/unexpand/src/unexpand.rs, en la ruta rápida de unexpand_buf alrededor de las líneas 512–523, y sigue cómo gestiona la entrada terminada en salto de línea antes de tratar los espacios en blanco según Unicode. Reproduce el problema con el comando del issue y compara el modo predeterminado con -a; el trabajo estará terminado cuando el modo predeterminado convierta los caracteres U+3000 iniciales en una tabulación con un salto de línea final y pasen las pruebas pertinentes de unexpand.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

U - unexpand

In a UTF-8 locale, unexpand leaves leading Unicode blanks unchanged when the line ends in a newline. Removing that newline makes the same blanks convert to a tab. GNU coreutils 9.12 converts them in both cases.

Reproduced on main c1f172886c6643f61ffde5a1ce3db0aaf14e182b on Linux, in both debug and release builds:

python3 -c 'print("\u3000" * 4 + "X")' |
  LC_ALL=C.UTF-8 coreutils unexpand | od -An -tx1

The input is four U+3000 IDEOGRAPHIC SPACE characters (eight display columns), followed by X and a newline.

Expected, as printed by GNU unexpand 9.12:

09 58 0a

Actual:

e3 80 80 e3 80 80 e3 80 80 e3 80 80 58 0a

The same command with unexpand -a produces the expected tab. So does default unexpand if the final newline is omitted. --first-only has the same failure as default mode.

The first fast path in unexpand_buf (src/uu/unexpand/src/unexpand.rs:512-523) checks only for ASCII space and tab before copying a newline-terminated buffer unchanged. This bypasses the Unicode blank handling later in the function.

I compared 416 cases against GNU 9.12 across 13 Unicode blank characters, two UTF-8 locales, file/pipe input, with/without a final newline, and four option sets. Both uutils builds had the same 104 mismatches, all in default/--first-only mode with a final newline. All 44 existing unexpand integration tests pass.

Lenguaje dominante
Rust
Estrellas
24.3k
Forks
2.1k
Merge medio
1 d 21 h
PR fusionados (30 d)
357

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de uutils/coreutils

Todos los issues de uutils/coreutils

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.