Entrada

Solucionar error de Jekyll en Vercel por nombres de archivo con caracteres especiales

Guía paso a paso para corregir el error de compilación de Jekyll en Vercel causado por archivos con tildes, eñes u otros caracteres especiales en sus nombres, incluyendo cómo renombrarlos y actualizar referencias.

Solucionar error de Jekyll en Vercel por nombres de archivo con caracteres especiales

Introducción

Breve explicación del problema:

  • Al desplegar un sitio Jekyll en Vercel, el build fallaba con un error Encoding::UndefinedConversionError al intentar convertir nombres de archivo desde ASCII-8BIT a UTF-8.
  • La causa era que algunos ficheros en public/uploads/ tenían caracteres especiales (acentos, eñes, guiones raros, comillas tipográficas…).
  • Jekyll en Vercel no los manejaba bien y el build se rompía.

Síntomas del problema

  • El deploy en Vercel falla durante jekyll build.
  • Mensaje de error típico:

    1
    
    "\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
    
  • En local puede que funcione sin problema, pero en Vercel no.

Solución paso a paso

1. Identificar archivos problemáticos

Ejecutar en local un script Ruby para detectar ficheros con nombres no seguros y proponer renombres:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bundle exec ruby <<'RUBY'
require 'i18n'; I18n.available_locales = [:en]
require 'fileutils'

M = []
Dir.glob('public/uploads/**/*', File::FNM_CASEFOLD).sort.each do |p|
  next unless File.file?(p)
  dir  = File.dirname(p)
  base = File.basename(p)
  safe = I18n.transliterate(base) # quita tildes y caracteres raros
  safe = safe.downcase.gsub(/[^0-9a-z.\-]+/, '-').gsub(/-+/, '-').gsub(/^-|-$/, '')
  next if base == safe
  q = File.join(dir, safe)
  i = 1
  while File.exist?(q)
    q = File.join(dir, safe.sub(/(\.[^.]+)?$/){"-#{i}#{$1}"})
    i += 1
  end
  M << [p, q]
end

puts "# Renames:"
M.each{|old,new| puts "#{old}\t=>\t#{new}" }
File.write('uploads_renames.tsv', M.map{|o,n| "#{o}\t=>\t#{n}"}.join("\n")) unless M.empty?
RUBY

Esto genera un archivo uploads_renames.tsv con los cambios propuestos.


2. Renombrar los archivos

1
2
3
4
5
6
7
8
9
10
bundle exec ruby <<'RUBY'
require 'fileutils'
map = File.read('uploads_renames.tsv', encoding:'UTF-8').split("\n").map{|l| l.split("\t=>\t",2)}
map.each do |old,newp|
  next if old.nil? || newp.nil?
  FileUtils.mkdir_p(File.dirname(newp))
  FileUtils.mv(old, newp)
  puts "OK  #{old} -> #{newp}"
end
RUBY

3. Actualizar las referencias en posts y páginas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bundle exec ruby <<'RUBY'
map = File.read('uploads_renames.tsv', encoding:'UTF-8').split("\n").map{|l| l.split("\t=>\t",2)}
files = Dir.glob('{_posts,_tabs,_pages}/**/*.{md,markdown,html}', File::FNM_CASEFOLD) +
        Dir.glob('*.{md,markdown,html}', File::FNM_CASEFOLD)
files.uniq!
files.each do |f|
  txt = File.read(f, encoding:'UTF-8')
  org = txt.dup
  map.each do |old,newp|
    rel_old = old.sub(%r{\A\.?/},'')
    rel_new = newp.sub(%r{\A\.?/},'')
    txt.gsub!(rel_old, rel_new)
    txt.gsub!(File.basename(rel_old), File.basename(rel_new))
  end
  if txt != org
    File.write(f, txt, encoding:'UTF-8')
    puts "Updated: #{f}"
  end
end
RUBY

Resultado final

  • Todos los archivos en public/uploads tienen nombres compatibles con Vercel/Jekyll.
  • Las referencias en los posts se han actualizado.
  • El deploy en Vercel vuelve a funcionar sin errores.

Conclusión

  • Siempre es recomendable evitar caracteres especiales en nombres de archivo cuando se trabaja con Jekyll, Git y despliegues automáticos.
  • Este procedimiento no solo soluciona el problema puntual, sino que previene errores futuros al normalizar todos los nombres y referencias.
Esta entrada está licenciada bajo CC BY 4.0 por el autor.