【问题标题】:How to check whether input is a string in Erlang?如何检查输入是否是Erlang中的字符串?
【发布时间】:2017-09-21 04:13:29
【问题描述】:

我想写一个函数来检查输入是否是字符串:

is_string(Input) ->
  case check_if_string(Input) of
    true  -> {ok, Input};
    false -> error
  end.

但是我发现在 Erlang 中检查输入是否是字符串是很棘手的。 Erlang 中的字符串定义在这里:http://erlang.org/doc/man/string.html.

有什么建议吗?

提前致谢。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    在 Erlang 中,字符串实际上可以是很多东西,因此有几种方法可以做到这一点,具体取决于您所说的“字符串”的确切含义。值得记住的是,Erlang 中的每一种字符串都是某种字符或词位值的列表。

    编码不是简单的事情,尤其是在涉及 Unicode 时。字符几乎可以是任意高的值,词位在整数的深层列表中被全局化,而 Erlang iolist()s(这是超级有用)是自动扁平化的混合整数和二进制值的深层列表并在某些操作期间转换。如果您处理的不是可打印 ASCII 值的平面列表,那么我强烈建议您阅读以下内容:

    所以...这不是一个很简单的问题。

    怎么办?

    始终有效的快速回答:考虑数据的来源

    你应该知道你正在处理什么样的数据,无论是来自套接字还是来自文件,或者尤其是如果你是自己生成的。不过,在系统边缘,您可能需要一些帮助来净化数据,因为网络客户端会不时发送各种随机垃圾。

    io_lib 模块中有一些用于最常见情况的辅助函数:

    • io_lib:char_list/1:如果输入是 unicode 范围内的字符列表,则返回 true
    • io_lib:deep_char_list/1:如果输入是合法字符的深层列表,则返回 true
    • io_lib:deep_latin1_char_list/1:如果输入是 Latin-1 的深层列表(您的基本可打印 ASCII 值从 32 到 126),则返回 true
    • io_lib:latin1_char_list/1:如果输入是 flat 拉丁 1 字符的列表,则返回 true90% 的时间这是您要查找的内容
    • io_lib:printable_latin1_list/1:如果输入是可打印的 Latin-1 列表,则返回 true(如果上面不是您想要的,9% 的时间这是您想要的)
    • io_lib:printable_list/1:如果输入是可打印字符的平面列表,则返回 true
    • io_lib:printable_unicode_list/1:如果输入是可打印的 unicode 字符的平面列表,则返回 true(在 1% 的时间里这是你的问题——除了我们中的一些人,包括我自己在日本,这涵盖了 99 % 我的输入检查用例)。

    对于更特殊的情况,您可以使用re module 中的正则表达式,也可以编写自己的递归函数,在正则表达式不适合、不可能或可能使您易受攻击的特殊情况下通过字符串压缩到regex attacks

    【讨论】:

      【解决方案2】:

      在erlang中,字符串可以用列表或二进制表示。

      如果使用字符串作为列表,则可以使用以下函数进行检查:

      is_string([C|T]) when (C >= 0) and (C =< 255) ->
          is_string(T);
      is_string([]) ->
          true;
      is_string(_) ->
          false. 
      

      如果字符串在代码中用作二进制,则可以在构建函数中使用 is_binary(Term)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 2013-01-25
        • 2017-11-03
        • 2014-03-15
        • 1970-01-01
        相关资源
        最近更新 更多