eos 源代码学习笔记一

版权声明:凡原创系列文章,均笔者的辛勤于中,如转载,请文章顶部注明来源。谢谢配合 https://blog.csdn.net/smilejiasmile/article/details/82786365

eos 源代码学习笔记

1、eos 中的常见合约类型

  • newaccount
  • setcode
  • setabi
  • updateauth
  • deleteauth
  • linkauth
  • unlinkauth
  • canceldelay
  • onerror

在文件 eos\libraries\chain\include\eosio\chain\contract_types.hpp 文件中定义

2、语言环境局部( locale )变量的使用简介(目的是通过 gettext 软件包 来实现软件的全球化)

  • eos 代码实例如下:(eos\programs\cleos\main.cpp, main 函数一开始) 实现软件的全球化
setlocale(LC_ALL, "");
bindtextdomain(locale_domain, locale_path);
textdomain(locale_domain);
  • 背景简介:

    • i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改变就能够适应不同的语言和地区的需要。对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。 在全球化的时代,国际化尤为重要,因为产品的潜在用户可能来自世界的各个角落。通常与i18n相关的还有L10n(“本地化”的简称)。
    • 18n 主要使用 gettext 软件包使软件实现国际化支持。事实上它是一整套 i18n解决方案。现在开源程序中普遍通过分离语言文件 ,然后通过 gettext 软件包来实现国际化发展。
    • 计算机中一套定义用户的语言、国家和用于定义用户希望在其用户界面上看到的各种可以改变的选择的参数集合。通常一个locale标识符至少包括一个语言标识符和一个区域标识符。
    • 在UNIX和WINDOWS中,locale的控制是不同的。在UNIX下,通常通过环境变量来控制locale。这些环境变量包括:LC_ALL, LC_CTYPE, LC_TIME, 等等。你可以通过改变这些环境变量来控制你的程序或者命令所表现出来的locale,前提是这些程序或者命令必须是已经被国际化的和本地化的。在 Windows下,你可以通过改变控制面板上的“语言/区域”中的区域的值来设定Windows的当前用户的locale。
    • ()[https://baike.baidu.com/item/I18N/6771940?fr=aladdin]
  • C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法

  • setlocale()的作用:

    • 当向终端、控制台输出 wchar_t 类型的字符时,需要设置 setlocale(),因为通常终端、控制台环境自身是不支持 UCS 系列的字符集编码的,使用流操作函数时(如:printf()),在标准/RT库实现的内部会将 UCS 字符转换成合适的本地 ANSI 编码字符,转换的依据就是 setlocale() 设定的活动 locale,最后将结果字符序列传递给终端,对于来自终端的输入流这个过程刚好相反。
    • 当向终端、控制台输出 wchar_t 类型的字符时,需要设置 setlocale(),因为通常终端、控制台环境自身是不支持 UCS 系列的字符集编码的,使用流操作函数时(如:printf()),在标准/RT库实现的内部会将 UCS 字符转换成合适的本地 ANSI 编码字符,转换的依据就是 setlocale() 设定的活动 locale,最后将结果字符序列传递给终端,对于来自终端的输入流这个过程刚好相反。
  • 当 locale 为 NULL 时,函数只做取回当前 locale 操作,通过返回值传出,并不改变当前 locale。

  • 当 locale 为 “” 时,根据环境的设置定义的 LC_ALL 的值来设定 locale ,检测顺序是:环境变量 LC_ALL,每个单独的locale分类LC_*,最后是 LANG 变量。为了使程序可以根据环境来改变活动 locale,

    • 一般都在程序的初始化阶段加入下面代码:setlocale(LC_ALL, “”)
  • 当用 setlocale() 设置活动 locale 时,如果成功,会返回当前活动 locale 的全名称;如果失败,会返回 NULL。

  • 通过命令与 系统配置的 locale 进行交互:

  • 其中setlocale用来设定locale,比如LC_ALL,LC_CTYPE等,一般用法是:setlocale(LC_ALL, “”) 这用来设置LC_ALL,第二个参数是一个空字符串表示使用环境变量中定义的LC_ALL的值。

  • 然后就是用bindtextdomain,比如:bindtextdomain(“libgammu”, LOCALE_PATH);Linux i18n中,每个资源文件是.mo文件,这个文件是二进制的,用工具针对一个文本生成(作成二进制应该是考虑了性能)。所以,上面的代码 中,LOCALE_PATH指定的就是寻找mo文件的一个路径,一般的,如果调用了上面的代码,那么gettext library就会在这个地方寻找mo文件: /usr/share/locale-langpack//LC_MESSAGES/libgammu.mo

  • 此外,还有textdomain函数,比如:textdomain(“gammu”); 这个函数的作用是设置当前需要使用的text domain(这些text domain之前都要使用bindtextdomain来设定好以便能让gettext library找到那个mo文件)。如果我们的程序用到了多个mo文件,那就需要bindtextdomain多次,然后用textdomain来指定当 前需要使用哪个。比如gammu中,gammu命令行程序使用的就是gammu这个text domain,libgammu这个库使用的就是libgammu.mo

在Linux下,可以使用 locale -a 命令查看系统中所有已配置的 locale。用不带选项的 locale 命令查看当前 Shell 中活动的 locale。用 locale -m 命令查看locale系统支持的所有可用的字符集编码。

和locale相关的包叫做:locales,locale系统支持的所有可用locale在文件:/usr/share/i18n/SUPPORTED 中列出。

在Debian下,可用 dpkg-reconfigure locales 命令重新配置 locale,也可以手工修改 /etc/locale.gen 文件,然后运行 locale-gen 命令。

在Ubuntu下,修改 /var/lib/locales/supported.d/local 文件,配置新的 locale,然后运行 locale-gen 命令。

3、eos 源代码的一些优秀的博客汇总

感谢这些博主的技术分享:

1、https://blog.csdn.net/ITleaks/article/details/80359025
2、https://www.cnblogs.com/hbright/category/1239517.html
3、https://blog.csdn.net/omnispace/article/details/79395204
4、https://www.cnblogs.com/Evsward/p/eos-exchange.html
5、https://steemit.com/trending/eos
6、https://steemit.com/bitshares/@cifer/5b42mk-graphene
7、https://steemit.com/trending/bitshares
8、https://www.jianshu.com/p/a5feb292c7f4

猜你喜欢

转载自blog.csdn.net/smilejiasmile/article/details/82786365
eos