Iconv.convert return 值的顺序是否错误?
Are Iconv.convert return values in wrong order?
我有一个 phoenix/elixir 应用程序,我的字符串中只需要 ASCII 字符。
根据我的尝试和发现 here,这只能由 Iconv 正确完成。
:iconv.convert "utf-8", "ascii//translit", "árboles más grandes"
# arboles mas grandes
但是当我 运行 它在我的 mac 上时它说:
# 'arboles m'as grandes
似乎 returns 任何字符的大小超过一个字节的多个字母,并且顺序颠倒了。
例如:
- ä 将转为 \"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
运行 它通过 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 音译删除了独立的 accents/diacritics,但将组合字符转换为 'a
.
之类的东西
我有一个 phoenix/elixir 应用程序,我的字符串中只需要 ASCII 字符。 根据我的尝试和发现 here,这只能由 Iconv 正确完成。
:iconv.convert "utf-8", "ascii//translit", "árboles más grandes"
# arboles mas grandes
但是当我 运行 它在我的 mac 上时它说:
# 'arboles m'as grandes
似乎 returns 任何字符的大小超过一个字节的多个字母,并且顺序颠倒了。
例如:
- ä 将转为 \"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
运行 它通过 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 音译删除了独立的 accents/diacritics,但将组合字符转换为 'a
.