【问题标题】:Elixir integer list to string causes (UnicodeConversionError) invalid code pointElixir 整数列表到字符串导致 (UnicodeConversionError) 无效代码点
【发布时间】:2018-10-03 18:23:18
【问题描述】:

问题

我需要创建一个字符串,在其中插入一个整数列表。

"""
SomeQuery {
  someQuery(articleIds: #{inspect article_ids}) {
    edges {
      node {
        id
      }
    }
  }
}
"""

失败的例子

例如,[725553234] 列表使上面的示例失败:

article_ids = [725553234]

"""
SomeQuery {
  someQuery(articleIds: #{article_ids}) {
    edges {
      node {
        id
      }
    }
  }
}
"""
** (exit) an exception was raised:
    ** (UnicodeConversionError) invalid code point 725553234
        (elixir) lib/list.ex:839: List.to_string/1
        (commsapp_api) lib/my_project/client.ex:70: CommsappApi.News.Clients.CommunicationMs.Client.articles_feed/3

系统

Erlang/OTP 20 [erts-9.3] [来源] [64 位] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir 1.6.3(使用 OTP 20 编译)

尝试过的解决方案

它尝试了以下方法:

  • 使用inspect 不起作用:articleIds: #{inspect(article_ids)}
  • 将 IO.inspect 与 :char_lists opt 与 :as_list 一起使用:IO.inspect(article_ids, char_lists: :as_lists
  • 尝试将整数列表作为字符串加入:articleIds: [#{Enum.join(article_ids, ", ")}]
  • 将解析为字符串的整数插值:Enum.map(article_ids, &Integer.to_string/1) |> Enum.join(", ")
  • 我尝试使用单行而不是多行字符串,但不起作用
  • 尝试不同的解决方案后我不记得很多事情了...>.

猜测

在字符串中使用括号时会出现问题,Elixir 将插值视为一个列表并引发错误,因为它找不到代码点。

想法?

提前致谢!

【问题讨论】:

  • 您想要的确切输出是什么?你尝试过的这些方法都没有奏效?
  • #{inspect(ids)} 可能会工作。
  • @mudasobwa 不,它没有
  • @Dogbert 没有一个(以及其他更多)不起作用。我需要具有整数列表的强表示,以便能够使用该字符串作为主体进行网络调用(在我的代码 JFYI 中不使用网络库,它是使用 httpoison 的第三方 dep)。跨度>
  • 另外,请确认article_ids = [725553234] 后跟带有插值分配的字符串在iex 中失败。没有深入到项目代码中,只是这样:分配 ids ⇒ 分配插值字符串 ⇒ 繁荣。

标签: string-interpolation elixir


【解决方案1】:

通过使用 Enum.join 返回字符串并用 "," 分隔整数

Enum.join(list, ",")

或通过将每个整数值更改为字符串来使用 Enum.map 作为列表返回

Enum.map(list, &Integer.to_string/1)

列表 = [1, 2, 3, 4]

Enum.join(list, ",") -> "1,2,3,4"

Enum.map(list, &Integer.to_string/1) -> ["1", "2", "3", "4"]

【讨论】:

    【解决方案2】:

    strings, binaries and charlists 的文档中,字符列表被定义为点代码列表,即整数。代码

    article_ids = [725553234]
    "#{article_ids}"
    

    尝试打印点代码为725553234 的字符。此点代码未定义,您会收到错误消息。将725553234 替换为65,您应该会得到一个A 字符。

    要插入整数列表,您可能需要执行以下操作:

    iex(5)> a=[65, 66, 67]
    'ABC'
    iex(6)> "#{Enum.map(a, fn(c) -> Integer.to_string(c)<>" " end)}"
    "65 66 67 "
    

    顺便说一句,如果您查看列表 [65, 66, 67] 被解释为 'ABC'

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 2022-11-21
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多