【问题标题】:Standardize a String for Filename, remove accents and special chars标准化文件名字符串,删除重音符号和特殊字符
【发布时间】:2026-02-18 22:25:01
【问题描述】:

我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。

到目前为止我有这个:

my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').downcase.gsub(/[^a-z]/, '_')

但第一个问题:- 字符。我猜这个方法有更多的问题。

我不控制名称,名称字符串可以有重音符号、空格和特殊字符。我想删除所有这些,用相应的字母('é' => 'e')替换重音,然后用'_'字符替换其余部分。

名字是这样的:

  • “Prélèvements - 常规”
  • "Carnet de santé"
  • ...

我希望它们像一个文件名,没有空格/特殊字符:

  • “prelevements_routine”
  • “carnet_de_sante”
  • ...

感谢您的帮助:)

【问题讨论】:

标签: ruby-on-rails ruby regex string ruby-on-rails-3


【解决方案1】:

如果空格没问题,请使用ActiveStorage::Filename#sanitized

如果空间没问题(我建议保留),如果这是用户提供和/或用户可下载的文件,那么您可以使用专门针对这种情况的 ActiveStorage::Filename#sanitized 方法。

它删除了文件名中不允许使用的特殊字符,同时保留了用户通常用来很好地组织和描述其文件的所有好字符,例如空格和 & 符号。

ActiveStorage::Filename.new( "Prélèvements - Routine" ).sanitized 
#=> "Prélèvements - Routine"

ActiveStorage::Filename.new( "Carnet de santé" ).sanitized 
#=> "Carnet de santé"

ActiveStorage::Filename.new( "Foo:Bar / Baz.jpg" ).sanitized 
#=> "Foo-Bar - Baz.jpg"

如果您想删除几乎所有内容,请使用 String#parameterize

如果您真的想删除所有内容,请尝试String#parameterize

"Prélèvements - Routine".parameterize
#=> "prelevements-routine"

"Carnet de santé".parameterize
#=> "carnet-de-sante"

"Foo:Bar / Baz.jpg".parameterize
#=> "foo-bar-baz-jpg"

【讨论】:

    【解决方案2】:

    看看ActiveSupport::Inflector.transliterate,它对处理这种字符问题非常有用。在那里阅读:ActiveSupport::Inflector

    然后,您可以执行以下操作:

    ActiveSupport::Inflector.transliterate my_string.downcase.gsub(/\s/,"_")
    

    【讨论】:

    • 不适用于“xxx l'amour”之类的名称。修复:是添加 gsub(/'/, '')
    • 这也不适用于包含其他标点符号的字符串,如逗号,