Iconv.convert是否以错误的顺序返回值?

时间:2016-06-02 15:41:27

标签: ruby-on-rails elixir phoenix-framework iconv

我有一个phoenix / elixir应用程序,需要在我的String中只有ASCII字符。 根据我的尝试和发现here,这只能由Iconv正确完成。

:iconv.convert "utf-8", "ascii//translit", "árboles más grandes"
# arboles mas grandes

但是当我在我的Mac上运行它时说:

# 'arboles m'as grandes

对于任何大小超过一个字节的字符而言,它似乎会返回多个字母并且顺序转换。

例如:

  • ä将转向\“a
  • á将转向'a
  • ß将转向ss
  • 将转向~n

我在Mac上使用IEx 1.2.5运行它。

有没有办法绕过这个,或者通常是一种更好的方法来实现与rails音译相同的功能?

修改

所以这里是根据Henkik N上接受的答案更新类似rails的行为。它与rails参数化做同样的事情(将任何字符串转换成可以用作URL的一部分的字符串)

defmodule RailsLikeHelpers do
    require Inflex

    # replace accented chars with their ascii equivalents
    def transliterate_string(abc) do
      return :iconv.convert("utf-8", "ascii//translit", String.normalize(abc))
    end

    def parameterize_string(abc) do
      parameterize_string(abc, "_")
    end

    def parameterize_string(abc,seperator) do
      abc
      |> String.strip
      |> transliterate_string
      |> Inflex.parameterize(seperator) # turns "Your Momma" into "your_momma"
      |> String.replace(~r[#{Regex.escape(seperator)}{2,}],seperator)  # No more than one of the separator in a row.
    end
  end

1 个答案:

答案 0 :(得分:2)

通过Unicode分解运行它(正如the forum thread you linked to中提到的人类)似乎在我的OS X上执行:

iex> :iconv.convert "utf-8", "ascii//translit", String.normalize("árboles más grandes", :nfd)
"arboles mas grandes"

分解意味着它将被标准化,例如“á”表示为两个Unicode代码点(“a”和组合重音),而不是组合形式,它是单个Unicode代码点。所以我想iconv的ASCII音译会删除独立的重音符号/变音符号,但会将组合字符转换为'a之类的内容。