版本说明
- hexo v3.9.0
- hexo-theme-next v7.1.2
安装插件
安装 hexo-generator-searchdb,在站点的根目录下执行以下命令:
1 | $ npm install hexo-generator-searchdb --save |
修改配置文件
编辑站点配置文件,新增以下内容到任意位置:
1 | search: |
编辑主题配置文件,启用本地搜索功能:
1 | # Local search |
执行如下命令进行本地展示:
1 | hexo g |
参考next官方说明
安装 hexo-generator-searchdb,在站点的根目录下执行以下命令:
1 | $ npm install hexo-generator-searchdb --save |
编辑站点配置文件,新增以下内容到任意位置:
1 | search: |
编辑主题配置文件,启用本地搜索功能:
1 | # Local search |
执行如下命令进行本地展示:
1 | hexo g |
参考next官方说明
为了让博文被google或百度检索,需要使用hexo的sitemap功能。修改themes/next/_config.yml:
1 | menu: |
切换到hexo根目录下,安装搜索引擎插件,插件根据自己的需要安装其中一个或者都安装:
1 | npm install hexo-generator-sitemap --save |
如何此时你跟我一样使用的是next主题,直接执行如下命令即可访问站点地图:
1 | hexo g |
此时,在public的静态文件根目录中会多出一个sitemap.xml文件,表示谷歌检索的sitemap安装成功。
以GitHub Pages为例,新建的GitHub Pages是没有被谷歌检索的。在谷歌搜索栏中输入如下信息进行检索:
1 | site: xxx.github.io |
xxx为你的GitHub账号,如果没有被检索,不会显示hexo中的任何博文,如果有下面的步骤就可以省略了。
需要谷歌账号,没有的可以申请一个。登录GoogleSearchConsole,点击立即使用,输入需要验证所有权的网站地址,例如本站地址
1 | https://eericzeng.github.io |
对于hexo博客网站,最好使用HTML标记法验证网站所有权,复制Google给的标记内容粘贴到themes/next/layout/_partials/head/head.swig文件meta标签最后面。这里使用的是next主题,其他主题类似。我发现next主题有更好的配置方式,千万不要采用修改head.swig文件的方法,不然在升级NexT版本时会遇到很多不必要的麻烦。修改themes/next/_config.yml文件:
1 | # Google Webmaster tools verification. |
然后生成静态文件并发布:
1 | hexo g |
回到谷歌搜索控制台继续进行验证,点击完成。
打开谷歌控制台选择上一步添加的网站->索引->站点地图,在添加新的站点地图中填入”sitemap.xml”即可,添加成功会在已提交的站点地图中显示,过一段时间在概述中会显示被索引的情况。
登录百度资源管理平台,依次点击用户中心->站点管理->添加网站(网站会随时更新,路径可能不同,只要找到添加网站的位置就可以)。
输入网址
1 | https//eericzeng.github.io |
站点属性
最多可以选择三项,建议相关的都选上,提高曝光度
验证网站
NexT主题选择HTML标签验证即可,复制标签中的content值,修改next配置文件_config.yml:
1 | # Baidu Webmaster tools verification. |
百度资源页面先不要关闭,执行下面的步骤之后再点击完成验证。
hexo根目录下执行如下命令:
1 | hexo g |
回到百度资源网站,点击完成验证。
以next主题为例,修改主题的配置文件themes/next/_config.yml,生效分类和标签:
1 | menu: |
新创建的hexo博客没有分类和标签,点击分类或标签会提示”Cannot GET /categories/“和”Cannot GET /tags/“。
进入hexo博客所在的根目录,输入如下命令:
1 | hexo new page categories |
成功后提示:
1 | INFO Created: HEXO_ROOT\source\categories\index.md |
index.md的内容如下:
1 | --- |
这个index.md可以认为是存放分类的一个文档,只是type不同。修改为如下内容:
1 | --- |
找到source/_posts路径下的markdown文章,并修改其categories属性。以hexo自带的hexo-world.md为例,文件头修改为:
1 | --- |
此时,点击菜单栏中的“分类”,即可看到新建的“hexo”分类。
标签创建与分类类似,在控制台中输入如下命令:
1 | hexo new page tags |
tags/index.md内容与分类类似,修改为如下内容:
1 | --- |
同样在hello-world.md增加标签内容:
1 | --- |
某不知名springboot小项目,application.properties文件:
1 | custom.param=中文属性值 |
java代码:
1 | @SpringBootApplication |
控制台输出:
1 | ä¸æå±æ§å¼ |
先写结论:用@Value注解读取application.properties文件时,编码默认是ISO-8859-1,所以直接配置中文一定会乱码。注意,配置文件是springboot默认的配置文件application.properties或application-{active}.properties。其他配置文件会在原因分析中进行详解,原因分析涉及大量源码解读,如果不想烧脑深入分析的话可以直接跳到解决方案一节。
写本文时,我查了网上几乎所有关于@Value读取.properties中文乱码的文章。一种思路是修改编码格式;另外一种是利用插件/IDE将中文预先编码,在注入到变量后直接转码为所需要的中文。遇到中文乱码修改编码方式是常规思路,所以第一种思路看似没问题,但是把springboot所有关于encoding的配置参数修改为UTF-8后,中文乱码的问题依然没有解决。
Spring Boot版本:2.1.1.RELEASE
正如前文所述读取配置文件时,编码出现了问题。追踪一下spring boot是加载默认配置文件的过程,会发现org.springframework.boot.contex.config.ConfigFileApplicationListener类的loadDocuments()方法,源码如下:
1 | private List<Document> loadDocuments(PropertySourceLoader loader, String name, Resource resource) throws IOException { |
入参loader的类型是PropertySourceLoader,PropertySourceLoader是加载属性文件的接口,其实现有两个类:PropertiesPropertySourceLoader和YamlPropertySourceLoader。loader根据传入参数的实例调用load()方法,此处我们讨论.properties文件,接口声明和properties加载实现如下:
1 | /*********属性文件加载接口**********/ |
通过源码分析PropertiesPropertySourceLoader并不单纯的加载.properties文件,还包含.xml文件(似乎有违单一功能原则,不知道当初这样设计的初衷是啥)。顺着load()方法向下找->loadProperties(Resource)->OriginTrackedPropertiesLoader.load()->OriginTrackedPropertiesLoader.load(boolean)->OriginTrackedPropertiesLoader$CharacterReader(Resource)。
CharacterReader是OriginTrackedPropertiesLoader的内部静态类,而且只有一个构造函数,看看器构造参数就不难发现为啥application.properties是以ISO-8859-1编码加载的了:
1 | private static class CharacterReader implements Closeable { |
也就是说不论application.properties文件被设置为哪种编码格式,最终还是以ISO-8859-1的编码格式进行加载。
让我们再看看yml/yaml格式的文件,其加载由PropertySourceLoader接口的另外一个实例YamlPropertySourceLoader实现,即接口方法load():
1 | List<PropertySource<?>> load(String name, Resource resource) throws IOException; |
追一下load()的底层实现,采用org.yaml.snakeyaml.reader.UnicodeReader的实例对yml/ymal文件进行加载,而UnicodeReader实例对文件的初始化方法init()实现如下:
1 | protected void init() throws IOException { |
每次调用read()读文件时都会调用init()方法进行初始化,也就是这个时候确定文件的编码格式。首先读取BOM(Byte Order Mark)文件头信息,如果头信息中有UTF8/UTF16BE/UTF16LE就采用对应的编码,没有或者不是则采用UTF8编码。
采用@PropertySource(value=”classpath:test.properties”, encoding=”UTF-8”)方式读取配置文件可按照UTF-8的方式读取编码,而不是ISO-8859-1。@PropertySource配置的加载文件由ConfigurationClassParser.processPropertySource()进行解析,EncodedResource类决定最后由哪种编码格式加载文件,其方法如下:
1 | public Reader getReader() throws IOException { |
所以,虽然都是.properties文件,但是编码格式却是不一样的。
通过@PropertySource(value=”classpath:my.properties”, encoding=”UTF-8”)注解配置自定义文件,注意文件名不能是springboot默认的application.properties文件名称。
将yml/yaml文件设置为UTF-8的编码格式,springboot读该文件即采用UTF-8编码。
采用编译器或者插件将配置文件预编码。这种方法我没试过,但是想想也知道这是很反人类的。如果有人感兴趣的话,可以参考一下这篇博客最后一部分IDEA/eclipse的修改操作。
在配置application.properties时,都是开发比较重要的参数,尽量使用英文,业务相关的中文配置还是不要放到这里。
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment