【发布时间】: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