Now and Nawoo

読書メモ、技術メモ → C#, Solidity, Blockchain, Bitcoin, Ethereum, NFT

Solidity 学習メモ:文字列

随時追加編集していきます。

文字列の連結

一般的なプログラミング言語のように +で連結できない。(驚き!)

string s = "abc" + "def";

abi.encodePackedbytes.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) ←これは今は使えない

複数行の文字列リテラル

\[改行] は無視される。

string memory s = "ab\
cd\
ef"; // → "abcdef"

Types — Solidity 0.5.4 ドキュメント

文字列に日本語を使う

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);

Utilities - OpenZeppelin Docs