


<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>他小的有</title><link>http://www.suchone.com/</link><description>杨明的个人博客</description><item><title>树莓派4B安装docker+homeassistant</title><link>http://www.suchone.com/post/55.html</link><description>&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;一、安装docker：&lt;/span&gt;&lt;/strong&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;1.1 下载脚本&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;curl&amp;nbsp;-fsSL&amp;nbsp;https://get.docker.com&amp;nbsp;-o&amp;nbsp;get-docker.sh&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;1.2 以阿里云镜像安装脚本内容&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sh&amp;nbsp;get-docker.sh&amp;nbsp;--mirror&amp;nbsp;Aliyun&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;1.3 更换源&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;nano&amp;nbsp;/etc/docker/daemon.json&lt;/pre&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;registry-mirrors&amp;quot;:&amp;nbsp;[&amp;quot;https://registry.docker-cn.com&amp;quot;]
}&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;1.4 设定开机启动和重启&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;systemctl&amp;nbsp;enable&amp;nbsp;docker&amp;nbsp;#开机启动
sudo&amp;nbsp;systemctl&amp;nbsp;start&amp;nbsp;docker&amp;nbsp;#启动&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;二、安装 homeassistant +HASS&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;2.1 安装armhf-hassio-supervisor镜像：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;docker&amp;nbsp;pull&amp;nbsp;homeassistant/armhf-hassio-supervisor:latest&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;2.2 安装armhf-homeassistant镜像&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;docker&amp;nbsp;pull&amp;nbsp;homeassistant/armhf-homeassistant:latest&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;2.3 运行&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;docker&amp;nbsp;run&amp;nbsp;-d&amp;nbsp;\
&amp;nbsp;--name=&amp;quot;home-assistant&amp;quot;&amp;nbsp;\
&amp;nbsp;-v&amp;nbsp;/home/pi/homeassistant:/config&amp;nbsp;\
&amp;nbsp;-v&amp;nbsp;/etc/localtime:/etc/localtime:ro&amp;nbsp;\
&amp;nbsp;--net=host&amp;nbsp;\
&amp;nbsp;--restart=always&amp;nbsp;\
&amp;nbsp;homeassistant/armhf-homeassistant&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 29 Dec 2020 21:32:29 +0800</pubDate></item><item><title>树莓派4B无显示器安装系统</title><link>http://www.suchone.com/post/53.html</link><description>&lt;p&gt;&lt;strong style=&quot;font-size: 20px;&quot;&gt;准备软件：&lt;/strong&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: arial; font-size: 18px; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.SD Card Formatter：&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: arial; font-size: 18px; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a href=&quot;https://www.sdcard.org/downloads/formatter/eula_windows/SDCardFormatterv5_WinEN.zip&quot; target=&quot;_blank&quot; title=&quot;SDCardFormatterv5_WinEN.zip&quot;&gt;SDCardFormatterv5_WinEN.zip&lt;/a&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;（格式化TF卡工具）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: arial; font-size: 18px; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.Win32DiskImager：&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: arial; font-size: 18px; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a href=&quot;https://win32diskimager.download/Win32DiskImager-1.0.0-src.zip&quot; target=&quot;_blank&quot; title=&quot;Win32DiskImager-1.0.0-src.zip&quot;&gt;Win32DiskImager-1.0.0-src.zip&lt;/a&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;（系统镜像烧录工具）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: arial; font-size: 18px; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a href=&quot;https://win32diskimager.download/Win32DiskImager-1.0.0-src.zip&quot; target=&quot;_blank&quot; title=&quot;Win32DiskImager-1.0.0-src.zip&quot;&gt;&lt;/a&gt;&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;font-size: 18px;&quot;&gt;&amp;nbsp;&lt;strong&gt; 3.Raspberry Pi OS：&lt;/strong&gt;&lt;/span&gt;&lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_full_armhf/images/raspios_full_armhf-2020-12-04/2020-12-02-raspios-buster-armhf-full.zip&quot; target=&quot;_blank&quot; title=&quot;2020-12-02-raspios-buster-armhf-full.zip&quot; style=&quot;font-size: 18px; white-space: normal;&quot;&gt;2020-12-02-raspios-buster-armhf-full.zip&lt;/a&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;（树莓派官方系统，第一次使用建议下载完整桌面版）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;4.Putty：&lt;a href=&quot;https://the.earth.li/~sgtatham/putty/0.74/w64/putty-64bit-0.74-installer.msi&quot; target=&quot;_blank&quot; title=&quot;putty-64bit-0.74-installer.msi&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;a href=&quot;https://the.earth.li/~sgtatham/putty/0.74/w64/putty-64bit-0.74-installer.msi&quot; target=&quot;_blank&quot; title=&quot;putty-64bit-0.74-installer.msi&quot;&gt;putty-64bit-0.74-installer.msi&lt;/a&gt;（SSH远程工具）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;第一步：将TF卡插入读卡器并插入电脑，使用&lt;strong style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: arial; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;SD Card Formatter工具进行&lt;/span&gt;&lt;/strong&gt;格式化TF卡&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/12/202012281609157859431692.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;第二步：&lt;strong style=&quot;font-size: 16px; white-space: normal;&quot;&gt;下载树莓派系统并解压，解压之后得到一个.img文件，使用&lt;strong style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: arial; font-size: 18px; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;Win32DiskImager&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;将该文件并烧录到TF卡中，写入完成时系统可能提示需要格式化，此时不要格式化&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/12/202012281609157974534300.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;第三步：为了能让系统开机之后自动连线WIFI，需要新建一个wpa_supplicant.conf文件，并填入以下内容，复制到&lt;strong style=&quot;font-size: 16px; white-space: normal;&quot;&gt;boot&lt;/strong&gt;根目录&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;ctrl_interface=DIR=/var/run/wpa_supplicant&amp;nbsp;GROUP=netdev
update_config=1
country=CN

network={
	ssid=&amp;quot;WIFI名称&amp;quot;
	psk=&amp;quot;WIFI密码&amp;quot;
	key_mgmt=WPA-PSK
	priority=10
}&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/12/202012281609158579434275.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;第四步：默认情况下树莓派是关闭SSH的，需要新增一个ssh文件（不要带后缀）并放入boot根目录让其开机时打开SSH以便连接，然后&lt;strong style=&quot;font-size: 16px; white-space: normal;&quot;&gt;将TF卡从读取卡器取出并插入树莓中，启动树莓派&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/12/202012281609159234600804.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;第五步：打开路由器查看树莓派连接的IP地址，使用Putty工具进行连接，默认用户名：pi，密码：raspberry，输入密码时看不到字符变化，输入完毕回车即可&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/12/202012281609159373918433.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/12/202012281609159574546064.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; color: rgb(0, 0, 0);&quot;&gt;&lt;strong&gt;至此整个树莓派系统安装就完成了。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;/strong&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;树莓派默认使用的国外的源，访问速度较慢，这里建议更换为清华大学开源软件镜像站，使用管理员权限，编辑/etc/apt/sources.list文件&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;nano&amp;nbsp;/etc/apt/sources.list&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-variant-ligatures: common-ligatures; text-align: justify; background-color: rgb(255, 255, 255); font-family: &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;用#注释掉原文件内容，并在最后添加如下内容（建议直接复制粘贴避免拼写错误）&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;deb&amp;nbsp;http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/&amp;nbsp;buster&amp;nbsp;main&amp;nbsp;non-free&amp;nbsp;contrib
deb-src&amp;nbsp;http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/&amp;nbsp;buster&amp;nbsp;main&amp;nbsp;non-free&amp;nbsp;contrib&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/12/202012281609161889845673.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;font-size: 16px; white-space: normal;&quot;&gt;使用管理员权限，编辑/etc/apt/sources.list.d/raspi.list文件&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;nano&amp;nbsp;/etc/apt/sources.list.d/raspi.list&lt;/pre&gt;&lt;p&gt;&lt;strong style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-variant-ligatures: common-ligatures; text-align: justify; background-color: rgb(255, 255, 255); font-family: &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;用#注释掉原文件内容，并在最后添加如下内容（建议直接复制粘贴避免拼写错误）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;deb&amp;nbsp;http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/&amp;nbsp;buster&amp;nbsp;main&amp;nbsp;ui&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/12/202012281609161978935648.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;white-space: normal; font-size: 16px;&quot;&gt;&lt;span style=&quot;color: rgb(79, 79, 79); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: common-ligatures; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;white-space: normal; font-size: 16px;&quot;&gt;&lt;span style=&quot;color: rgb(79, 79, 79); font-size: 16px; font-variant-ligatures: common-ligatures; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;然后按下Ctrl+X退出，会提示是否需要保存，输入y然后回车确定即可&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;white-space: normal; font-size: 16px;&quot;&gt;&lt;span style=&quot;color: rgb(79, 79, 79); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; font-variant-ligatures: common-ligatures; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;; color: rgb(0, 0, 0);&quot;&gt;&lt;strong style=&quot;white-space: normal; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; font-variant-ligatures: common-ligatures; text-align: justify; background-color: rgb(255, 255, 255);&quot;&gt;最后执行更新&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;apt-get&amp;nbsp;update
sudo&amp;nbsp;apt-get&amp;nbsp;upgrade&lt;/pre&gt;&lt;p&gt;第一句&lt;span style=&quot;margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(69, 69, 69); font-family: Tahoma, Helvetica, Arial, STHeiti; line-height: 21px;&quot;&gt;是更新你的源列表，&lt;/span&gt;&lt;span style=&quot;margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(69, 69, 69); font-family: Tahoma, Helvetica, Arial, STHeiti; line-height: 21px;&quot;&gt;换源后必须执行。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;margin: 0px; padding: 0px; background-color: rgb(255, 255, 255); color: rgb(69, 69, 69); font-family: Tahoma, Helvetica, Arial, STHeiti; line-height: 21px;&quot;&gt;第二句为&lt;span style=&quot;color: rgb(69, 69, 69); font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: rgb(255, 255, 255);&quot;&gt;是更新软件，如果你对新版本软件的需求不是那么迫切，可以不执行。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;其它：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;修改时区：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;sudo&amp;nbsp;timedatectl&amp;nbsp;set-timezone&amp;nbsp;Asia/Shanghai&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;结束！&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;</description><pubDate>Sun, 27 Dec 2020 23:32:00 +0800</pubDate></item><item><title>Python脚本自动修改.rc文件版本号</title><link>http://www.suchone.com/post/52.html</link><description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;发布软件时，需要修改.rc文件的版本号再编译工程，以便于当模块出现问题快速确定所使用模块的版本号，可使用Python在编译前进行自动修改版本号再编译发布：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//util_modify_rc_file_version.py&lt;/p&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;#&amp;nbsp;modify&amp;nbsp;.rc&amp;nbsp;file&amp;nbsp;version
import&amp;nbsp;sys,re

if&amp;nbsp;__name__==&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filename&amp;nbsp;=&amp;nbsp;sys.argv[1]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version&amp;nbsp;=&amp;nbsp;sys.argv[2]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;versionMacro&amp;nbsp;=&amp;nbsp;version.replace(&amp;#39;.&amp;#39;,&amp;nbsp;&amp;#39;,&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;versionString&amp;nbsp;=&amp;nbsp;version.replace(&amp;#39;,&amp;#39;,&amp;nbsp;&amp;#39;.&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filename&amp;nbsp;=&amp;nbsp;filename.replace(&amp;quot;\\\\&amp;quot;,&amp;quot;\\&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;nbsp;=&amp;nbsp;open(filename,&amp;nbsp;&amp;#39;r&amp;#39;,&amp;nbsp;encoding=&amp;#39;utf-16&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lines&amp;nbsp;=&amp;nbsp;f.readlines()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newLines&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;line&amp;nbsp;in&amp;nbsp;lines:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;line.startswith(&amp;#39;&amp;nbsp;FILEVERSION&amp;nbsp;&amp;#39;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line&amp;nbsp;=&amp;nbsp;&amp;#39;&amp;nbsp;FILEVERSION&amp;nbsp;&amp;#39;&amp;nbsp;+&amp;nbsp;versionMacro&amp;nbsp;+&amp;nbsp;&amp;#39;\n&amp;#39;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;line.startswith(&amp;#39;&amp;nbsp;PRODUCTVERSION&amp;nbsp;&amp;#39;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line&amp;nbsp;=&amp;nbsp;&amp;#39;&amp;nbsp;PRODUCTVERSION&amp;nbsp;&amp;#39;&amp;nbsp;+&amp;nbsp;versionMacro&amp;nbsp;+&amp;nbsp;&amp;#39;\n&amp;#39;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line&amp;nbsp;=&amp;nbsp;re.sub(&amp;nbsp;r&amp;#39;(\s+VALUE\s&amp;quot;FileVersion&amp;quot;,\s+)&amp;quot;(.*)&amp;quot;&amp;#39;,r&amp;#39;\1&amp;quot;%s&amp;quot;&amp;#39;&amp;nbsp;%&amp;nbsp;versionString,&amp;nbsp;line)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line&amp;nbsp;=&amp;nbsp;re.sub(&amp;nbsp;r&amp;#39;(\s+VALUE\s&amp;quot;ProductVersion&amp;quot;,\s+)&amp;quot;(.*)&amp;quot;&amp;#39;,r&amp;#39;\1&amp;quot;%s&amp;quot;&amp;#39;&amp;nbsp;%&amp;nbsp;versionString,&amp;nbsp;line)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newLines.append(line)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;nbsp;=&amp;nbsp;open(filename,&amp;nbsp;&amp;#39;w&amp;#39;,&amp;nbsp;encoding=&amp;#39;utf-16&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.writelines(newLines)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.close()&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;示例：&lt;/p&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;python&amp;nbsp;&amp;quot;C:\util_modify_rc_file_version.py&amp;quot;&amp;nbsp;&amp;quot;C:\demo.rc&amp;quot;&amp;nbsp;&amp;quot;1.2.3.4&amp;quot;&lt;/pre&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 说明：传入的第一个参数是要修改的.rc文件路径，第二个参数是版本号&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;其它：配合Jenkins在发布时自动修改版本号效果更佳，一劳永逸 :)&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(255, 0, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;注意：我当前使用的是VS2015生成的.rc文件默认编码是utf-16 little endian，其它编码请自行修改打开和保存.rc文件的编码，另外要在执行这个脚本修改.rc文件版本后再编译项目哟~&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Sat, 31 Oct 2020 17:29:34 +0800</pubDate></item><item><title>C++ std::cout在cmd输出中文乱码的解决方案</title><link>http://www.suchone.com/post/51.html</link><description>&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;1.如果是命令行的方式，在执行命令前先执行&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;chcp&amp;nbsp;65001&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;2.通过system命令修改编码&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;brush:cpp;toolbar:false&quot;&gt;#include&amp;nbsp;&amp;quot;stdafx.h&amp;quot;
#include&amp;nbsp;&amp;lt;Windows.h&amp;gt;
#include&amp;nbsp;&amp;lt;iostream&amp;gt;

int&amp;nbsp;main()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&amp;quot;chcp&amp;nbsp;65001&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;u8&amp;quot;中华人民共和国&amp;quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::system(&amp;quot;pause&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(255, 0, 0); font-size: 16px;&quot;&gt;缺点：会额外输出 Active code page: 65001&amp;nbsp;字符串。&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;3.通过SetConsoleOutputCP函数修改编码&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;brush:cpp;toolbar:false;&quot;&gt;#include&amp;nbsp;&amp;quot;stdafx.h&amp;quot;
#include&amp;nbsp;&amp;lt;Windows.h&amp;gt;
#include&amp;nbsp;&amp;lt;iostream&amp;gt;

int&amp;nbsp;main()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetConsoleOutputCP(CP_UTF8);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;u8&amp;quot;中华人民共和国&amp;quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::system(&amp;quot;pause&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
}&lt;/pre&gt;</description><pubDate>Sat, 11 Jul 2020 15:07:25 +0800</pubDate></item><item><title>Windows字符串编码转换，char/wchar_t/utf-8之间相互转换</title><link>http://www.suchone.com/post/50.html</link><description>&lt;p style=&quot;text-indent: 2em;&quot;&gt;字符串乱码往往是由于编码不一致或编码没有对应的字符所致，为了能够正常显示字符串，经常会有需要编码转换的需要，为了方便使用这里整理成一个head-only文件，这里提供了char、wchar_t、utf-8之间的转换，在实际的项目中建议使用wchar_t/utf-8，强烈建议使用utf-8。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;//ZEncode.hpp&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:cpp;toolbar:false&quot;&gt;#pragma&amp;nbsp;once
#include&amp;nbsp;&amp;lt;Windows.h&amp;gt;
#include&amp;nbsp;&amp;lt;string&amp;gt;
#include&amp;nbsp;&amp;lt;vector&amp;gt;
#include&amp;nbsp;&amp;lt;assert.h&amp;gt;

/*!
&amp;nbsp;*&amp;nbsp;编码转换命名空间
&amp;nbsp;*&amp;nbsp;
&amp;nbsp;*/
namespace&amp;nbsp;ZEncode
{
	/*!
	&amp;nbsp;*&amp;nbsp;窄字节转宽字节
	&amp;nbsp;*&amp;nbsp;
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;str&amp;nbsp;窄字节
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;uCodePage&amp;nbsp;窄字节编码
	&amp;nbsp;*&amp;nbsp;\return&amp;nbsp;宽字节
	&amp;nbsp;*/
	static&amp;nbsp;std::wstring&amp;nbsp;A2W(const&amp;nbsp;std::string&amp;nbsp;&amp;amp;str,&amp;nbsp;UINT&amp;nbsp;uCodePage)
	{
		int&amp;nbsp;nLength&amp;nbsp;=&amp;nbsp;::MultiByteToWideChar(uCodePage,&amp;nbsp;0,&amp;nbsp;str.c_str(),&amp;nbsp;-1,&amp;nbsp;NULL,&amp;nbsp;0);
		if&amp;nbsp;(0&amp;nbsp;==&amp;nbsp;nLength)
		{
			throw&amp;nbsp;std::exception(&amp;quot;A2W&amp;nbsp;Error&amp;quot;);
		}
		std::wstring&amp;nbsp;strW(nLength,&amp;nbsp;L&amp;#39;\0&amp;#39;);
		int&amp;nbsp;nResult&amp;nbsp;=&amp;nbsp;::MultiByteToWideChar(uCodePage,&amp;nbsp;0,&amp;nbsp;str.c_str(),&amp;nbsp;-1,&amp;nbsp;&amp;amp;strW[0],&amp;nbsp;nLength);
		if&amp;nbsp;(nResult&amp;nbsp;!=&amp;nbsp;nLength)
		{
			throw&amp;nbsp;std::exception(&amp;quot;A2W&amp;nbsp;Error&amp;quot;);
		}
		strW.resize(nLength&amp;nbsp;-&amp;nbsp;1);
		return&amp;nbsp;strW;
	}

	/*!
	&amp;nbsp;*&amp;nbsp;宽字节转窄字节
	&amp;nbsp;*&amp;nbsp;
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;str&amp;nbsp;宽字节
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;uCodePage&amp;nbsp;窄字节编码
	&amp;nbsp;*&amp;nbsp;\return&amp;nbsp;窄字节
	&amp;nbsp;*/
	static&amp;nbsp;std::string&amp;nbsp;W2A(const&amp;nbsp;std::wstring&amp;nbsp;&amp;amp;str,&amp;nbsp;UINT&amp;nbsp;uCodePage)
	{
		int&amp;nbsp;nLength&amp;nbsp;=&amp;nbsp;::WideCharToMultiByte(uCodePage,&amp;nbsp;0,&amp;nbsp;str.c_str(),&amp;nbsp;-1,&amp;nbsp;NULL,&amp;nbsp;0,&amp;nbsp;NULL,&amp;nbsp;NULL);
		if&amp;nbsp;(0&amp;nbsp;==&amp;nbsp;nLength)
		{
			throw&amp;nbsp;std::exception(&amp;quot;W2A&amp;nbsp;Error&amp;quot;);
		}
		std::string&amp;nbsp;strA(nLength,&amp;nbsp;&amp;#39;\0&amp;#39;);
		int&amp;nbsp;nResult&amp;nbsp;=&amp;nbsp;::WideCharToMultiByte(uCodePage,&amp;nbsp;0,&amp;nbsp;str.c_str(),&amp;nbsp;-1,&amp;nbsp;&amp;amp;strA[0],&amp;nbsp;nLength,&amp;nbsp;NULL,&amp;nbsp;NULL);
		if&amp;nbsp;(nResult&amp;nbsp;!=&amp;nbsp;nLength)
		{
			throw&amp;nbsp;std::exception(&amp;quot;W2A&amp;nbsp;Error&amp;quot;);
		}
		strA.resize(nLength&amp;nbsp;-&amp;nbsp;1);
		return&amp;nbsp;strA;
	}

	/*!
	&amp;nbsp;*&amp;nbsp;窄字节转窄字节
	&amp;nbsp;*&amp;nbsp;
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;str&amp;nbsp;窄字节
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;uCodePageFrom&amp;nbsp;源始字节编码
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;uCodePageTo&amp;nbsp;目标字节编码
	&amp;nbsp;*&amp;nbsp;\return&amp;nbsp;窄字节
	&amp;nbsp;*/
	static&amp;nbsp;std::string&amp;nbsp;A2A(const&amp;nbsp;std::string&amp;nbsp;&amp;amp;str,&amp;nbsp;UINT&amp;nbsp;uCodePageFrom,&amp;nbsp;UINT&amp;nbsp;uCodePageTo)
	{
		return&amp;nbsp;W2A(A2W(str,&amp;nbsp;uCodePageFrom),&amp;nbsp;uCodePageTo);
	}

	/*!
	&amp;nbsp;*&amp;nbsp;检查缓冲区数据是否是UTF-8
	&amp;nbsp;*&amp;nbsp;
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;pBuffer&amp;nbsp;缓冲区
	&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;size&amp;nbsp;大小
	&amp;nbsp;*&amp;nbsp;\return&amp;nbsp;如果是返回true，否则返回false。
	&amp;nbsp;*&amp;nbsp;
	&amp;nbsp;*&amp;nbsp;\note&amp;nbsp;返回结果并不一定完全正确，仅作为一个参考用途。
	&amp;nbsp;*/
	static&amp;nbsp;bool&amp;nbsp;IsUTF8(const&amp;nbsp;void*&amp;nbsp;pBuffer,&amp;nbsp;size_t&amp;nbsp;size)
	{
		//参考&amp;nbsp;http://blog.csdn.net/bladeandmaster88/article/details/54767487
		bool&amp;nbsp;bIsUTF8&amp;nbsp;=&amp;nbsp;true;
		unsigned&amp;nbsp;char*&amp;nbsp;start&amp;nbsp;=&amp;nbsp;(unsigned&amp;nbsp;char*)pBuffer;
		unsigned&amp;nbsp;char*&amp;nbsp;end&amp;nbsp;=&amp;nbsp;(unsigned&amp;nbsp;char*)pBuffer&amp;nbsp;+&amp;nbsp;size;

		while&amp;nbsp;(start&amp;nbsp;&amp;lt;&amp;nbsp;end)
		{
			if&amp;nbsp;(*start&amp;nbsp;&amp;lt;&amp;nbsp;0x80)&amp;nbsp;//&amp;nbsp;(10000000):&amp;nbsp;值小于0x80的为ASCII字符&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
			{
				start++;
			}
			else&amp;nbsp;if&amp;nbsp;(*start&amp;nbsp;&amp;lt;&amp;nbsp;(0xC0))&amp;nbsp;//&amp;nbsp;(11000000):&amp;nbsp;值介于0x80与0xC0之间的为无效UTF-8字符&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
			{
				bIsUTF8&amp;nbsp;=&amp;nbsp;false;
				break;
			}
			else&amp;nbsp;if&amp;nbsp;(*start&amp;nbsp;&amp;lt;&amp;nbsp;(0xE0))&amp;nbsp;//&amp;nbsp;(11100000):&amp;nbsp;此范围内为2字节UTF-8字符&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
			{
				if&amp;nbsp;(start&amp;nbsp;&amp;gt;=&amp;nbsp;end&amp;nbsp;-&amp;nbsp;1)
					break;

				if&amp;nbsp;((start[1]&amp;nbsp;&amp;amp;&amp;nbsp;(0xC0))&amp;nbsp;!=&amp;nbsp;0x80)
				{
					bIsUTF8&amp;nbsp;=&amp;nbsp;false;
					break;
				}
				start&amp;nbsp;+=&amp;nbsp;2;
			}
			else&amp;nbsp;if&amp;nbsp;(*start&amp;nbsp;&amp;lt;&amp;nbsp;(0xF0))&amp;nbsp;//&amp;nbsp;(11110000):&amp;nbsp;此范围内为3字节UTF-8字符
			{
				if&amp;nbsp;(start&amp;nbsp;&amp;gt;=&amp;nbsp;end&amp;nbsp;-&amp;nbsp;2)
					break;

				if&amp;nbsp;((start[1]&amp;nbsp;&amp;amp;&amp;nbsp;(0xC0))&amp;nbsp;!=&amp;nbsp;0x80&amp;nbsp;||&amp;nbsp;(start[2]&amp;nbsp;&amp;amp;&amp;nbsp;(0xC0))&amp;nbsp;!=&amp;nbsp;0x80)
				{
					bIsUTF8&amp;nbsp;=&amp;nbsp;false;
					break;
				}
				start&amp;nbsp;+=&amp;nbsp;3;
			}
			else
			{
				bIsUTF8&amp;nbsp;=&amp;nbsp;false;
				break;
			}
		}

		return&amp;nbsp;bIsUTF8;
	}

	/*!
	*&amp;nbsp;检查字符串是不是UTF-8编码
	*
	*&amp;nbsp;\param&amp;nbsp;str&amp;nbsp;缓冲区
	*&amp;nbsp;\return&amp;nbsp;如果是返回true，否则返回false。
	*&amp;nbsp;
	*&amp;nbsp;\note&amp;nbsp;返回结果并不一定完全正确，仅作为一个参考用途。
	*/
	static&amp;nbsp;bool&amp;nbsp;IsUTF8(const&amp;nbsp;std::string&amp;nbsp;&amp;amp;str)
	{
		return&amp;nbsp;IsUTF8(str.c_str(),&amp;nbsp;str.size());
	}
}

//为了方便方便使用定义的宏
#define&amp;nbsp;ANSI_TO_WCHAR(str)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ZEncode::A2W(str,&amp;nbsp;CP_ACP))
#define&amp;nbsp;ANSI_TO_UTF8(str)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ZEncode::A2A(str,&amp;nbsp;CP_ACP,&amp;nbsp;CP_UTF8))

#define&amp;nbsp;UTF8_TO_ANSI(str)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ZEncode::A2A(str,&amp;nbsp;CP_UTF8,&amp;nbsp;CP_ACP))
#define&amp;nbsp;UTF8_TO_WCHAR(str)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ZEncode::A2W(str,&amp;nbsp;CP_UTF8))

#define&amp;nbsp;WCHAR_TO_ANSI(str)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ZEncode::W2A(str,&amp;nbsp;CP_ACP))
#define&amp;nbsp;WCHAR_TO_UTF8(str)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ZEncode::W2A(str,&amp;nbsp;CP_UTF8))&lt;/pre&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;white-space: normal; text-indent: 2em;&quot;&gt;&amp;nbsp;测试用例（备注：Windows中文版环境[gb2312]，Visual Studio默认文件编码[gb2312]）：&lt;/p&gt;&lt;pre class=&quot;brush:cpp;toolbar:false&quot;&gt;/*****&amp;nbsp;ZEncode&amp;nbsp;*****/
namespace&amp;nbsp;ZEncodeTest
{
	TEST(ZEncode,&amp;nbsp;ansi_to_wchar_to_ansi)
	{
		std::string&amp;nbsp;strANSI(&amp;quot;中华人民共和国&amp;quot;);
		std::wstring&amp;nbsp;strWChar&amp;nbsp;=&amp;nbsp;ANSI_TO_WCHAR(strANSI);
		EXPECT_STREQ(strWChar.c_str(),&amp;nbsp;L&amp;quot;中华人民共和国&amp;quot;);
		EXPECT_STREQ(WCHAR_TO_ANSI(strWChar).c_str(),&amp;nbsp;&amp;quot;中华人民共和国&amp;quot;);
	}

	TEST(ZEncode,&amp;nbsp;ansi_to_utf8_to_wchar)
	{
		std::string&amp;nbsp;strANSI(&amp;quot;中华人民共和国&amp;quot;);
		std::string&amp;nbsp;strUTF8&amp;nbsp;=&amp;nbsp;ANSI_TO_UTF8(strANSI);
		EXPECT_FALSE(ZEncode::IsUTF8(strANSI));
		EXPECT_TRUE(ZEncode::IsUTF8(strUTF8));
		EXPECT_STREQ(UTF8_TO_WCHAR(strUTF8).c_str(),&amp;nbsp;L&amp;quot;中华人民共和国&amp;quot;);
	}

	TEST(ZEncode,&amp;nbsp;ansi_to_utf8_to_ansi)
	{
		std::string&amp;nbsp;strANSI(&amp;quot;中华人民共和国&amp;quot;);
		std::string&amp;nbsp;strUTF8&amp;nbsp;=&amp;nbsp;ANSI_TO_UTF8(strANSI);
		EXPECT_FALSE(ZEncode::IsUTF8(strANSI));
		EXPECT_TRUE(ZEncode::IsUTF8(strUTF8));
		EXPECT_STREQ(UTF8_TO_ANSI(strUTF8).c_str(),&amp;nbsp;strANSI.c_str());
	}

	TEST(ZEncode,&amp;nbsp;wchar_to_utf8_to_wchar)
	{
		std::wstring&amp;nbsp;strWChar(L&amp;quot;中华人民共和国&amp;quot;);
		std::string&amp;nbsp;strUTF8&amp;nbsp;=&amp;nbsp;WCHAR_TO_UTF8(strWChar);
		EXPECT_TRUE(ZEncode::IsUTF8(strUTF8));
		EXPECT_STREQ(UTF8_TO_WCHAR(strUTF8).c_str(),&amp;nbsp;strWChar.c_str());
	}
}&lt;/pre&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;white-space: normal; text-indent: 2em;&quot;&gt;&amp;nbsp; 其它：在C++11中，如果希望初始化的字符串编码为utf-8，只需要在字符前面新增u8即可，如下：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;brush:cpp;toolbar:false&quot;&gt;std::string&amp;nbsp;s1&amp;nbsp;=&amp;nbsp;&amp;quot;中华人民共和国&amp;quot;;&amp;nbsp;&amp;nbsp;//取决于文件编码
std::string&amp;nbsp;s2&amp;nbsp;=&amp;nbsp;u8&amp;quot;中华人民共和国&amp;quot;;&amp;nbsp;&amp;nbsp;//utf-8编码&lt;/pre&gt;</description><pubDate>Sun, 05 Jul 2020 22:43:25 +0800</pubDate></item><item><title>Jenkins执行Python脚本时如何获取WORKSPACE，JOB_NAME</title><link>http://www.suchone.com/post/49.html</link><description>&lt;p&gt;&amp;nbsp; 通过Jenkins上的Python插件执行Python脚本时可通过环境变量的方式获取WORKSPACE，JOB_NAME的方法示例：&lt;/p&gt;&lt;pre class=&quot;brush:python;toolbar:false&quot;&gt;import&amp;nbsp;os
workspace=os.environ[&amp;#39;WORKSPACE&amp;#39;]
jobName=os.environ[&amp;#39;JOB_NAME&amp;#39;]
print&amp;nbsp;workspace
print&amp;nbsp;jobName&lt;/pre&gt;</description><pubDate>Sun, 05 Jul 2020 10:47:50 +0800</pubDate></item><item><title>使用devenv命令来编译解决方案下的工程</title><link>http://www.suchone.com/post/48.html</link><description>&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-family: &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;SF Pro Display&amp;quot;, Roboto, Noto, Arial, &amp;quot;PingFang SC&amp;quot;, sans-serif; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow-x: auto; overflow-wrap: break-word; white-space: normal; background-color: rgb(255, 255, 255); text-indent: 2em;&quot;&gt;在自动集成和发布中（如果Jenkins），经常需要命令行的形式来启动Visual Studio来编译项目，可以使用devenv来启动Visual Studio编译项目工和，如下：&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;devenv&amp;nbsp;&amp;quot;%WORKSPACE%\Demo.sln&amp;quot;&amp;nbsp;/build&amp;nbsp;Debug&amp;nbsp;/project&amp;nbsp;&amp;quot;Project1\Project1.vcxproj&amp;quot;&amp;nbsp;/projectconfig&amp;nbsp;Debug
devenv&amp;nbsp;&amp;quot;%WORKSPACE%\Demo.sln&amp;quot;&amp;nbsp;/build&amp;nbsp;Release&amp;nbsp;/project&amp;nbsp;&amp;quot;Project1\Project1.vcxproj&amp;quot;&amp;nbsp;/projectconfig&amp;nbsp;Release&lt;/pre&gt;</description><pubDate>Fri, 03 Jul 2020 23:28:41 +0800</pubDate></item><item><title>从Nuget导入包之后，提示头文件和函数未找到的问题</title><link>http://www.suchone.com/post/45.html</link><description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;从nuget导入包到程序中时，可以正常包含头文件，也可以正常使用函数和编译，但是在IDE中显示无法找到头文件和无法跳转到函数，提示函数未定义，如下图所示：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2019/03/201903271553666168663083.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案：关闭项目，删除*.VC.db文件，重新打开项目即可。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2019/03/201903271553666272878820.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Mar 2019 13:53:45 +0800</pubDate></item><item><title>清除Nuget本地缓存</title><link>http://www.suchone.com/post/44.html</link><description>&lt;p style=&quot;text-indent: 2em;&quot;&gt;场景：在Nuget服务器上发布相同的版本号的包，在客户端Nuget获取的包不是服务器最新版本时，可通过清除本地缓存再重新拉取包可解决这个问题。&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;解决方案：打开Nuget控制台，执行清除本地缓存&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;注意事项：需要先下载nuget.exe，并添加到环境变量（在控制台输入nuget命令有对应的信息）&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush:as3;toolbar:false&quot;&gt;nuget&amp;nbsp;locals&amp;nbsp;all&amp;nbsp;-clear&lt;/pre&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;操作步骤：Tools -&amp;gt; NuGet Package Manager -&amp;gt; Package Manager Colsole&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/07/202007051593963875681437.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;输入上面的命令回车即可：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.suchone.com/zb_users/upload/2020/07/202007051593964074653843.png&quot; title=&quot;正在上传...&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-indent: 2em;&quot;&gt;此时再拉取对应的包即可。&lt;/p&gt;</description><pubDate>Sat, 09 Mar 2019 23:51:28 +0800</pubDate></item><item><title>C++ std::string format 函数</title><link>http://www.suchone.com/post/43.html</link><description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;brush:cpp;toolbar:false&quot;&gt;#include&amp;nbsp;&amp;lt;string&amp;gt;
#include&amp;nbsp;&amp;lt;vector&amp;gt;

/**
&amp;nbsp;*&amp;nbsp;格式化字符串
&amp;nbsp;*&amp;nbsp;
&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;pszFmt&amp;nbsp;格式描述
&amp;nbsp;*&amp;nbsp;\param&amp;nbsp;...&amp;nbsp;不定参数
&amp;nbsp;*&amp;nbsp;\return&amp;nbsp;格式化的结果字符串
&amp;nbsp;*/
std::string&amp;nbsp;format(const&amp;nbsp;char&amp;nbsp;*pszFmt,&amp;nbsp;...)
{
	std::string&amp;nbsp;str;
	va_list&amp;nbsp;args;
	va_start(args,&amp;nbsp;pszFmt);
	{
		int&amp;nbsp;nLength&amp;nbsp;=&amp;nbsp;_vscprintf(pszFmt,&amp;nbsp;args);
		nLength&amp;nbsp;+=&amp;nbsp;1;&amp;nbsp;&amp;nbsp;//上面返回的长度是包含\0，这里加上
		std::vector&amp;lt;char&amp;gt;&amp;nbsp;chars(nLength);
		_vsnprintf(chars.data(),&amp;nbsp;nLength,&amp;nbsp;pszFmt,&amp;nbsp;args);
		str.assign(chars.data());
	}
	va_end(args);
	return&amp;nbsp;str;
}

//使用示例：
char&amp;nbsp;c&amp;nbsp;=&amp;nbsp;&amp;#39;A&amp;#39;;
std::string&amp;nbsp;str&amp;nbsp;=&amp;nbsp;format(&amp;quot;c=%c&amp;quot;,&amp;nbsp;c);&amp;nbsp;&amp;nbsp;//&amp;nbsp;c=A
	
int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;10;
str&amp;nbsp;=&amp;nbsp;format(&amp;quot;i=%d&amp;quot;,&amp;nbsp;i);&amp;nbsp;&amp;nbsp;//&amp;nbsp;i=10

double&amp;nbsp;d&amp;nbsp;=&amp;nbsp;1.5;
str&amp;nbsp;=&amp;nbsp;format(&amp;quot;d=%f&amp;quot;,&amp;nbsp;d);&amp;nbsp;&amp;nbsp;//&amp;nbsp;d&amp;nbsp;=&amp;nbsp;1.500000

std::string&amp;nbsp;strName&amp;nbsp;=&amp;nbsp;(&amp;quot;txdy&amp;quot;);
str&amp;nbsp;=&amp;nbsp;format(&amp;quot;I&amp;nbsp;am&amp;nbsp;%s&amp;quot;,&amp;nbsp;strName.c_str());&amp;nbsp;&amp;nbsp;//&amp;nbsp;I&amp;nbsp;am&amp;nbsp;txdy&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这样，就可以很方便的格式化字符串了，程序中使用字符串是最常见的操作了，自己也可以封装一个CString类将其归类起来，方便以后的项目中使用。&lt;/p&gt;</description><pubDate>Wed, 16 Aug 2017 19:53:28 +0800</pubDate></item></channel></rss><!--49.11 ms , 6 query , 1942kb memory , 0 error-->