Solidity语言 - 字符串

这篇文章详细介绍了Solidity中的字符串处理,包括其动态大小、UTF-8编码、字符串长度的计算、字符访问及Unicode支持等核心概念。此外,还介绍了在Solidity 0.8.12版本中新增的字符串拼接功能。文章通过代码示例清晰地展示了每个概念,使读者能更好地理解和应用这些知识。

字符串是动态大小的 UTF-8 编码字节,也是一个动态大小的字节数组。两者可以通过使用 string() 将字符串转换为字节,以及使用 bytes() 将字节转换为字符串来互相转换。这极大地方便了我们进行字符串操作,就像其他编程语言一样。然而,由于字符串是 UTF-8 编码的,如果某个字符需要超过一个字节,就会增加字符串操作的难度。

因为字符串是数组,当传递给函数时需要 calldata 或 memory 修饰符,返回时需要 memory 修饰符。

检查字符串长度的方法:

function stringLength(
    string memory input
)
    public
    pure
    returns (uint256) {
        return bytes(input).length;
        // input.length 不可用
}

这并不是指字符串中有多少个字符,而是字节数组的长度。Unicode 字符占用多个字节。

访问字符串中的字符的方法:

function characterOfString(
    string memory input,
    uint256 index
)
    public
    pure
    returns (string memory) {
        bytes memory char = new bytes(1);
        char[0] = bytes(input)[index];
        return string(char);
}

请记住,这只在整个字符串为 ASCII 时有效。如果我们传入占用多个字节的 Unicode 字符,例如“你好”,代码将崩溃。

从字符串中获取字符比使用 JavaScript 或 Python 的索引方式要难一些,因为我们必须初始化一个长度为 1 的字符串数组,然后将我们想要获取的字符插入到新的字符串数组中。这就是上面代码所做的。

Solidity 支持 Unicode 字符串:

contract Message {
    // 不需要 getter 函数,这是公有的
    // 注意 “unicode” 修饰符
    string public message = unicode"你好👋ℝ𝔸ℝ𝔼𝕊𝕜𝕚𝕝𝕝𝕊";
}

有一点稍微令人误解的是,在 Solidity 中使用“字符串”来表示十六进制数据(如果使用了 hex 修饰符)。以下代码展示了将“helloworld”的十六进制编码转换回“helloworld”。

contract HexData {
    // 不是一个字符串!
    bytes hexData = hex"68656C6C6F776F726C64";
    // 返回 "helloworld"
    function getMessage()
        public
        view
        returns (string memory) {
            return string(hexData);
    }
}

在 Solidity 0.8.12 中,字符串的连接变得简单,新增了 string.concat()。在该版本之前,string.concat() 不可用。

了解更多

查看我们的 Solidity bootcamp 以了解更多关于智能合约开发和代币标准的信息。

  • 原文链接: rareskills.io/learn-soli...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/