Jekyll构建时中文路径报错解决


Jekyll构建时中文路径报错解决

Published on August 11, 2024 by Andersen

Jekyll

1 min READ

错误信息如下:

/var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/url.rb:161:in `encode': "\\xE5" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/url.rb:161:in `unescape_path'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/static_file.rb:56:in `destination'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/cleaner.rb:60:in `block (2 levels) in new_files'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/site.rb:364:in `block in each_site_file'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/site.rb:364:in `each'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/site.rb:364:in `each_site_file'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/cleaner.rb:60:in `block in new_files'
	from <internal:kernel>:90:in `tap'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/cleaner.rb:59:in `new_files'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/cleaner.rb:25:in `obsolete_files'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/cleaner.rb:15:in `cleanup!'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/site.rb:221:in `cleanup'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/site.rb:81:in `process'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/command.rb:28:in `process_site'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/commands/build.rb:65:in `build'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/commands/build.rb:36:in `process'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/command.rb:91:in `block in process_with_graceful_fail'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/command.rb:91:in `each'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/command.rb:91:in `process_with_graceful_fail'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/lib/jekyll/commands/build.rb:18:in `block (2 levels) in init_with_program'
	from /var/lib/gems/3.1.0/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `block in execute'
	from /var/lib/gems/3.1.0/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `each'
	from /var/lib/gems/3.1.0/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in `execute'
	from /var/lib/gems/3.1.0/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:in `go'
	from /var/lib/gems/3.1.0/gems/mercenary-0.4.0/lib/mercenary.rb:21:in `program'
	from /var/lib/gems/3.1.0/gems/jekyll-4.3.3/exe/jekyll:15:in `<top (required)>'
	from /usr/local/bin/jekyll:25:in `load'
	from /usr/local/bin/jekyll:25:in `<top (required)>'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/cli/exec.rb:58:in `load'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/cli/exec.rb:58:in `kernel_load'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/cli/exec.rb:23:in `run'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/cli.rb:455:in `exec'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/cli.rb:35:in `dispatch'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/cli.rb:29:in `start'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/exe/bundle:28:in `block in <top (required)>'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
	from /var/lib/gems/3.1.0/gems/bundler-2.5.17/exe/bundle:20:in `<top (required)>'
	from /usr/local/bin/bundle:25:in `load'
	from /usr/local/bin/bundle:25:in `<main>'

主要问题原因: 图片资源使用 /assets/img/ 中的中文目录

解决方法:

  1. 进入文件 /var/lib/gems/3.0.0/gems/jekyll-4.3.2/lib/jekyll/url.rb 第 161 行
  2. path = path.encode("utf-8") 改为 path = path.force_encoding("utf-8")
def self.unescape_path(path)
    path = path.force_encoding("utf-8")
    # path = path.encode("utf-8")
    return path unless path.include?("%")

    Addressable::URI.unencode(path)
end