这篇文章详细介绍了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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!