《礼记》有言“大道之行也,天下为公。”随着世界全球化的浪潮卷起,各行各业的格局与视野都将进一步的扩宽,在潜移默化中受之影响。而字符编码的发展也应验了互联网的共享思维,从单一的本国字符集发展到可容纳全世界文字符号的字符集。而Solidity中string类型的存储采用的格式也是本着共建“地球村”的信念出发的。

实验目的

1.初步体会版本变动,对中文字符输入的要求变化。

2.明白string类型的存储格式。不同形式的参数,字节存储的大小。

实验要求

1.因版本问题,中文字符需要特殊声明,请补全代码,使状态变量chineseName编译通过。

2.查看下面的代码,请按前三个注释的要求将答案填写进注释的括号内。填写好后,再编译部署,然后调用getNameLength,getSpecialNameLength,getChineseNameLength这三个函数检查你的答案是否正确。思考string类型的参数形式不同,它存储字节的大小是否也不同?

3.调用getName,getChineseName函数,查看这两个变量的bytes返回形式,思考string类型在Solidity中用什么格式来存储。一个英文字符占几个字节,一个中文字符占几个字节?

以下是本实验所使用的测试代码,请使用remix编辑器完成该实验

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract demo{
    string name ="Laozi";
    string specialName ="!@#$%^&*";
string chineseName ="老子";   //请补充代码使之编译成功

    //函数getNameLength返回name的字节长度是多少?  (1)
    function getNameLength() public view returns(uint){
        return bytes(name).length;
    }
    //函数getSpecialNameLength返回specialName的字节长度是多少? (2)
    function getSpecialNameLength() public view returns(uint){
        return bytes(specialName).length;
    }
    //函数getChineseNameLength返回chineseName的字节长度是多少? (3)
    function getChineseNameLength() public view returns(uint){
        return bytes(chineseName).length;
    }
    
    function getName() public view returns(bytes memory){
        return bytes(name);
    }
    
    function getChineseName() public view returns(bytes memory){
        return bytes(chineseName);
    }  
}

下面是本次实验所配套的教学视频: