Solidity 学習メモ:文字列
随時追加編集していきます。
文字列の連結
一般的なプログラミング言語のように +で連結できない。(驚き!)
string s = "abc" + "def";
abi.encodePacked
やbytes.concat
を使う。
string memory s = string(abi.encodePacked("abc", "def")); string memory s = string(bytes.concat(bytes("abc"), bytes("def")));
ネット検索すると文字列連結には abi.encodePacked
を使う例が多い。Solidityのドキュメントでは、v0.5.4ではabi.encodePacked
を使う例が紹介されていたが、v0.8.7ではbytes.concat
を使っている。
文字列の比較
keccak256(abi.encodePacked(s1)) == keccak256(abi.encodePacked(s2)) // keccak256(abi.encode(s1)) == keccak256(abi.encode(s2)) ← これを使っている人もいる // keccak256(s1) == keccak256(s2) ←これは今は使えない
- Types — Solidity 0.8.7 documentation
- keccak - keccak256 string comparison failure - Ethereum Stack Exchange
複数行の文字列リテラル
\[改行] は無視される。
string memory s = "ab\ cd\ ef"; // → "abcdef"
文字列に日本語を使う
UTF-8エンコードする。 UTF-8 encoder/decoder
// string memory s = "あいうえお"; ←エラー Invalid character in string. string memory s = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
uint256をstringに変換
OpenZeppelinを使う。
import "@openzeppelin/contracts/utils/Strings.sol"; (中略) string memory s = Strings.toString(i);