{"content":{"title":"Solidity语言 - 字符串","body":"字符串是动态大小的 UTF-8 编码字节，也是一个动态大小的字节数组。两者可以通过使用 `string()` 将字符串转换为字节，以及使用 `bytes()` 将字节转换为字符串来互相转换。这极大地方便了我们进行字符串操作，就像其他编程语言一样。然而，由于字符串是 UTF-8 编码的，如果某个字符需要超过一个字节，就会增加字符串操作的难度。\r\n\r\n因为字符串是数组，当传递给函数时需要 calldata 或 memory 修饰符，返回时需要 memory 修饰符。\r\n\r\n检查字符串长度的方法：\r\n\r\n```solidity hljs\r\nfunction stringLength(\r\n    string memory input\r\n)\r\n    public\r\n    pure\r\n    returns (uint256) {\r\n        return bytes(input).length;\r\n        // input.length 不可用\r\n}\r\n```\r\n\r\n这并不是指字符串中有多少个字符，而是字节数组的长度。Unicode 字符占用多个字节。\r\n\r\n访问字符串中的字符的方法：\r\n\r\n```solidity hljs\r\nfunction characterOfString(\r\n    string memory input,\r\n    uint256 index\r\n)\r\n    public\r\n    pure\r\n    returns (string memory) {\r\n        bytes memory char = new bytes(1);\r\n        char[0] = bytes(input)[index];\r\n        return string(char);\r\n}\r\n```\r\n\r\n请记住，这只在整个字符串为 ASCII 时有效。如果我们传入占用多个字节的 Unicode 字符，例如“你好”，代码将崩溃。\r\n\r\n从字符串中获取字符比使用 JavaScript 或 Python 的索引方式要难一些，因为我们必须初始化一个长度为 1 的字符串数组，然后将我们想要获取的字符插入到新的字符串数组中。这就是上面代码所做的。\r\n\r\nSolidity 支持 Unicode 字符串：\r\n\r\n```solidity hljs\r\ncontract Message {\r\n    // 不需要 getter 函数，这是公有的\r\n    // 注意 “unicode” 修饰符\r\n    string public message = unicode\"你好👋ℝ𝔸ℝ𝔼𝕊𝕜𝕚𝕝𝕝𝕊\";\r\n}\r\n```\r\n\r\n有一点稍微令人误解的是，在 Solidity 中使用“字符串”来表示十六进制数据（如果使用了 hex 修饰符）。以下代码展示了将“helloworld”的十六进制编码转换回“helloworld”。\r\n\r\n```solidity hljs\r\ncontract HexData {\r\n    // 不是一个字符串!\r\n    bytes hexData = hex\"68656C6C6F776F726C64\";\r\n    // 返回 \"helloworld\"\r\n    function getMessage()\r\n        public\r\n        view\r\n        returns (string memory) {\r\n            return string(hexData);\r\n    }\r\n}\r\n```\r\n\r\n在 Solidity 0.8.12 中，字符串的连接变得简单，新增了 `string.concat()`。在该版本之前，`string.concat()` 不可用。\r\n\r\n### 了解更多\r\n\r\n查看我们的 [Solidity bootcamp](https://learnblockchain.cn/column/1) 以了解更多关于智能合约开发和代币标准的信息。\r\n \r\n\r\n>- 原文链接： [rareskills.io/learn-soli...](https://www.rareskills.io/learn-solidity/strings)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/20722","address":null},"history":null,"timestamp":1741331717,"version":1}