【问题标题】:Are Iconv.convert return values in wrong order?Iconv.convert 返回值的顺序是否错误?
【发布时间】:2016-06-02 15:41:26
【问题描述】:

我有一个 phoenix/elixir 应用程序,我的字符串中只需要包含 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-like 行为。它与 rails parameterize 执行相同的操作(将任何字符串转换为可以用作 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

【问题讨论】:

  • 我的 Mac 上似乎得到了相同的输出,但在我的一台生产服务器 (Linux) 上却得到了预期:"arboles mas grandes"
  • 感谢您的检查。那可能有什么。使用 Iconv 中的 c 绑定

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


【解决方案1】:

通过 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 之类的东西。

【讨论】:

  • 是的,就是这样!不错的发现
猜你喜欢
  • 2011-12-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多