我有一个phoenix / elixir应用程序,需要在我的String中只有ASCII字符。 根据我的尝试和发现here,这只能由Iconv正确完成。
:iconv.convert "utf-8", "ascii//translit", "árboles más grandes"
# arboles mas grandes
但是当我在我的Mac上运行它时说:
# 'arboles m'as grandes
对于任何大小超过一个字节的字符而言,它似乎会返回多个字母并且顺序转换。
例如:
我在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
答案 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
之类的内容。