Rails loading ActiveSupport regex with ISO-8859-1 encoding instead of UTF-8

Viewed 132

When I call '返回'.titleize on a Chinese-language string in the Rails 6 app on my server, I get an error:

Encoding::CompatibilityError: incompatible encoding regexp match (ISO-8859-1 regexp with UTF-8 string)

The source for the titleize function leads to the following in ActiveSupport::Inflector:

def titleize(word, keep_id_suffix: false)
  humanize(underscore(word), keep_id_suffix: keep_id_suffix).gsub(/\b(?<!\w['’`()])[a-z]/) do |match|
    match.capitalize
  end
end

Although calling ActiveSupport::Inflector.titleize('返回') gives the error above, if I just copy the function body and run it as follows, there's no error --- I just get the correct titleize behaviour:

ActiveSupport::Inflector.humanize(ActiveSupport::Inflector.underscore('返回'), keep_id_suffix: false).gsub(/\b(?<!\w['’`()])[a-z]/) do |match|
  match.capitalize
end

I guess that the regular expression /\b(?<!\w['’()])[a-z]/ is getting compiled with a ISO-8859-1 encoding when ActiveSupport::Inflector loads but is compiling with a different encoding when I run it in my Rails console, but I don't see anything I can do with this information.

What can I do to get the Rails helper titleize to work on my server as intended?

I'm on Rails 6, Ruby 2.6.6, and ENV["LANG"] is en_US.utf8.

0 Answers
Related