Linux打开文本文件乱码处理

本笔记记录了从windows拷贝含中文的文本文件到linux中,中文乱码的处理。

原理

windows中的中文默认用GBKGB2312GB18030或其他本地编码,而这些编码集默认不能在linux中被识别。

为什么会有中文编码集。字符编码集的发展可以分为三个阶段

  • ASCII
  • Extended ASCII
  • 字符编码集的国际化

ASCII码使用7bits编码,2^7=128,包括95个可打印字符和33个不可打印字符。很早期计算机使用并不广泛,所以编码128个字符足够。但随着计算机发展,很多功能性符号(加减乘除)和欧洲非英语国家语言中带声调的字符就无法表示了。所以将使用7 bits编码扩展为使用8 bits编码,这就是第一次对ASCII码的扩充,即Extended ASCII

Extended ASCII编码个数从128 增加到255,包括数学运算符,带音标的欧洲字符,表格符和其他。但像中日韩字符还是无法编码。中文编码集有GB2312GBK等,但这些都是本地化的编码,如果国外用户想访问中文网站,而客户端未安装相应的编码集,那么国外用户只会看到乱码。

国际化的字符编码集即Unicode,兼容全球的字符集。它定义了世界通用符号集,用UTF-8UTF-16等实现。一般使用UTF-8编码。

处理方法

第一种方法从源头修改。在windows中编辑中文文本时更改编码格式为UTF-8

第二种方法当不能从源头更改时,比如拷贝的他人的文件。该情况下从接收端即linux系统中更改文件编码格式。
假如有一个从windows拷贝来的中文文本文件original.txt,linux中打开乱码,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*Ä£·ÂmnistÊýŸÝŒ¯ÖÆ×÷×ÔŒºµÄÊýŸÝŒ¯ŽúÂë*/
ŽúÂëÒ»¹²°üº¬ÈýžöÎÄŒþ
image2BinaryData.h
image2BinaryData.cpp
main.cpp

ÆäÖУºimage2BinaryData.h ºÍ image2BinaryData.cpp ÀïÃ涚ÒåÁËÏà¹ØµÄÀàºÍº¯Êý£¬¿ÉžùŸÝ×ÔŒºµÄÊýŸÝŒ¯×ÔÐÐÐÞžÄ

ʹÓ÷œ·š£º
ÔÚMain.hÎÄŒþÖÐÉèÖúÃ×ÔŒºµÄ͌ƬŽóСÒÔŒ°ÏȹصÄÎÄŒþ·Ÿ¶£¬±àÒëÔËÐÐŒŽ¿É¡£

˵Ã÷£º
ŽËŽúÂëÖ»ÊʺÏËùÓÐ͌ƬŽóСһÖµĻҶÈÍŒÏñ£¬²»ÊʺϲÊÉ«ÍŒÏñ£¬¿É¶ÔÏàӊλÖÃ×ÔÐÐœøÐÐÐޞġ£
͌ƬÃüÃû¹æÔò£º0_00001.jpg£º0±íÊŸ¶Ôӊ͌ƬµÄÄÚÈÝ£¬ŒŽ±êÇ©£»00001±íÊŸ±êǩΪ0µÄ͌ƬÖеÚ1ÕÅ͌Ƭ£¬00002ΪµÚ2ÕÅ͌Ƭ£¬ÒÔŽËÀàÍÆ........
ŽËŽúÂëÊʺÏÀà±ðÊýÉÙÓÚµÈÓÚ10µÄÊýŸÝŒ¯£¬Èç¹ûÀà±ðÊý¶àÓÚ10ÖÖ£¬¿É×ÔÐÐÐޞĎúÂëÖÐÏàÓŠ²¿·Ö

ÔËÐл·Ÿ³£ºwin10 + VS2015 + Opencv3.1.0

首先判断文件具体是用的那种编码

1
$ chardet3 original.txt

返回如下,表示有99%的信心认为original.txt是用GB2312编码的。

1
original.txt: GB2312 with confidence 0.99

然后用如下命令将编码格式从GB2312变到UTF-8

1
$ iconv -f GB2312 -t utf-8 original.txt -o file_utf-8.txt

新的文件file_utf-8.txt会被创建。Linux中打开它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*模仿mnist数据集制作自己的数据集代码*/
代码一共包含三个文件
image2BinaryData.h
image2BinaryData.cpp
main.cpp

其中:image2BinaryData.h 和 image2BinaryData.cpp 里面定义了相关的类和函数,可根据自己的数据集自行修改

使用方法:
在Main.h文件中设置好自己的图片大小以及先关的文件路径,编译运行即可。

说明:
此代码只适合所有图片大小一致的灰度图像,不适合彩色图像,可对相应位置自行进行修改。
图片命名规则:0_00001.jpg:0表示对应图片的内容,即标签;00001表示标签为0的图片中第1张图片,00002为第2张图片,以此类推........
此代码适合类别数少于等于10的数据集,如果类别数多于10种,可自行修改代码中相应部分

运行环境:win10 + VS2015 + Opencv3.1.0

明白背后原理就有的放矢了,至少知道如何提问从而找到答案。

完成
Linux打开文本文件乱码处理

Linux下使用hexo创建静态博客并部署到github

这篇博客记录了在linux系统下,安装hexo及所需必要工具,并创建local博客,最终部署到远端如github的整个过程。

1. 安装必要工具

使用root权限

1
$ root -s

1.1 下载node.js (root)

下载node.js安装包到我的Applications目录,
解压并设置软连接

1
2
3
$ tar -xvf node-v10.16.0-linux-x64.tar.xz 
$ ln -s /home/YOURNAME/Applications/node-v10.16.0-linux-x64/bin/npm /usr/local/bin/
$ ln -s /home/YOURNAME/Applications/node-v10.16.0-linux-x64/bin/node /usr/local/bin/

检查是否安装好

1
2
$ node -v
$ npm -v

若无误,进行下一步。

1.2 安装hexo (root)

使用npm安装hexo

1
$ npm install -g hexo-cli

如果终端提示平台不兼容,忽略它。可以转到nodejsbin目录下,hexo存在表示hexo已经下载好了。
建立软连接,后检查。

1
2
$ ln -s /home/YOURNAME/Applications/node-v10.16.0-linux-x64/bin/hexo /usr/local/bin/
$ hexo -v

当不能正常下载时,用cnpm下载,先下载cnpm

1
npm install -g cnpm --registry=https://registry.npm.taobao.org

只需将npm换为cnpm

若无误, 进行下一步。

2. 生成本地静态博客

初始化博客 (root)

在目录中新建一个存放所有blogs的目录, 并进入该目录,之后的所有操作都在其中。

1
2
$ mkdir blogs
$ cd blogs

第一次安装使用hexo需要初始化。初始化后该目录中回生成_config.yml, source 等文件。
开启本地服务。本地服务是用来显示blog的最终效果,并且可以及时修正。

1
2
$ hexo init
$ hexo server

使用终端给出的端口登录,可以看到hexo为我们创建的默认博客: Hello World

当关闭本地端口后,用下面命令清理。尤其在页面显示不正常时

1
$ hexo clean

建立第一篇本地静态博客 (所有用户)

确保现在仍在blogs/目录中, 使用如下命令新建博客

1
$ hexo new "My_first_blog"

此时就可以在nvim(或vim)使用markdown写博客了

1
$ nvim source/_post/My_first_blog.md

当然可以转到My_first_blog.md 所在目录用其他编辑器写内容,但记得编辑结束后一定退回到blogs/目录。

确保仍在blogs/目录中,使用如下命令生成静态博客。

1
$ hexo generate

后开启本地服务。

1
$ hexo server

打开给出端口,可以显示所创建的静态博客。目前会有两篇博客: Hello WorldMy_first_blog。到此为止,本地静态博客已经成功初始化,并创建了自己的第一篇博客。

静态博客只是便于检查,修改博客。我们的目的是要把博客部署到服务上。

3. 部署到github (root)

这部分假设你已经有github账户,本地已经安装github,并可以熟练使用github。
如果未安装,安装

1
$ sudo apt-get install git-core

3.1. 为静态博客新建repository

新建repository并命名。个人博客的repo名是有规定的:OWNER.github.ioOWNER 一定是你的github账户名。点击create repository。此时一个空的repo建好了。不要关闭此页面。

3.2. 本地安装git插件并配置 (root)

确保现在仍在blogs/目录中, 如下命令安装插件,并忽略warning

1
$ npm install --save hexo-deployer-git

_config.yml配置文件中添加第3.1步所建立空repo的信息。具体是在_config.yml
的文件尾的# Deplotment下添加repobranch两行。注意冒号后有一空格。
更多细节参考官方主页

1
2
3
4
5
6
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo: https://github.com/OWNER/OWNER.github.io.git
branch: master

其中https://github.com/OWNER/OWNER.github.io.git 是第3.1步空repo的地址。OWNER是你的github账户名。

3.3. 部署本地静态博客 (root)

用下面命令执行部署(blogs/目录中)

1
$ hexo deploy

在终端提示处输入githubusernamepassword
此时刷新第3.1步的页面,repo不再是空的了。

3.4. 访问

在浏览器输入OWNER.github.io即可从远端访问。
可能无法马上访问,稍等,刷新页面即可。

4. 部署后对博客的修改或新建 (root)

确保仍在blogs/目录中,创建新的博客后生成对应的.md文件。
对相应的.md文件添加或修改内容。
后在本地检查。

1
$ hexo server

本地检查无误后生成并部署到github

1
2
$ hexo generate
$ hexo deploy

或一条命令完成

1
$ hexo generate --deploy

5. 插入图片

  1. 修改配置文件_config.ymlpost_asset_folder:的值设置为true
  2. 回到blog/目录中,安装插件cnpm install https://github.com/7ym0n/hexo-asset-image --save。这个asset管理插件是没有bug的。
  3. 新建博客hexo new "xxx"。在/source/_posts文件夹内会生成xxx.md和同名的xxx文件夹
  4. 把在xxx.md中要引用的图片放到xxx文件夹中。
  5. 在写博客过程中引入图片:

    <div align=center><img src="xxx/resnet.png" width=500></div>:在你的md编辑器中图片可以正常显示,但4000端口和github上不能显示。

    <div align=center><img src="resnet.png" width=500></div>:相反的,md编辑器中不能显示,远端可以。

    后者才是正确的引用。
  6. 回到blog/目录中,生成及部署hexo g --d

6. 更改当前主题属性 (root)

以更改背景图片为例,保证当前目录为blog目录,图片存在于blog下的blog/themes/landscape/source/css/images/中,名为banner.jpg,选择自己喜欢的图片命名为banner.jpg并替换原来图片。在blog目录中开启服务hexo server。在localhost就可以看到变化。

若果要更改主题其他参数,回到上一级目录即blog/themes/landscape/source/css/编辑器打开目录中的_variables.styl文件。内容类似:

1
2
3
4
5
35 // Header
36 logo-size = 50px
37 subtitle-size = 16px
38 banner-height = 400px
39 banner-url = "images/banner.jpg"

修改对应参数值,后刷新localhost,就可以看到及时变化。

最后,回到blog/目录,执行一下命令保证github远端也得到更新:

1
2
$ hexo clean
$ hexo g --d

完成!

7. 添加“分类”和“tags” (root)

进入blog目录

  1. source中生成categories文件夹:tags是默认就含有的,不用添加。

    1
    $ hexo new page categories
  2. 编辑 blog/source/categoriesindex.md。添加type: categories于末行。保存并退出

    1
    2
    3
    4
    5
    ---
    title: categories
    date: 2020-01-11 17:48:47
    type: categories
    ---
  1. 给每一篇blog添加categories,如下。注意:hexo一篇文章只能属于一个分类,即如果在“- web前端”下方添加“-xxx”,hexo不会产生两个分类,而是把分类嵌套(即该文章属于 “- web前端”下的 “-xxx ”分类)。

    1
    2
    3
    4
    5
    6
    7
    8
    ---
    title: Linux(ubuntu)下使用hexo创建静态博客并部署到github
    date: 2019-07-28 12:36:32
    tags:
    - hahaha
    categories:
    - utility
    ---

    最终blog每一页都会出现categoriestagstag cloud三个标签。

8. 修改页面显示博客数 (root)

  1. 获取sudo权限并安装hexo的三个插件,archive的,tag的category的:

    1
    2
    3
    4
    $ sudo -s
    $ cnpm install hexo-generator-archive --save
    $ cnpm install hexo-generator-tag --save
    $ cnpm install hexo-generator-category --save
  2. 在目录/media/junhui/DATA/blog/下,编辑_config.yml,添加如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    archive_generator:
    enabled: true
    per_page: 0
    yearly: true
    monthly: true
    daily: false
    order_by: -date

    tag_generator:
    per_page: 0
    order_by: -date

    category_generator:
    per_page: 0
    order_by: -date
  3. 自定义对应的per_page数值。其中0表示显示所有blog,就是说,不分页。

9. Trouble Shooting

  1. 如果需要更改blog文件明,直接在源文件中修改即可。
  2. 对于已有的blog文件,只需要将源文件和其图片文件夹复制到blogs目录下。
  3. 当生成及部署完毕后,远端不会马上生效,不慌张,稍等。

Markdown-常用语法

常用的记录下来,方便查找

  • 插入图片

    1
    <div align=center><img src="IMAGE_PATH.png" width=500></div>
  • 添加图片描述

    1
    <div align=center>Description of images</div>
  • 表格

    1
    2
    3
    4
    5
    指标 | 值   
    :-|:-
    Maximum dimensionality of grid of thread blocks | 3 |
    Maximum x- or y-dimension of a block | 1024 |
    Maximum z-dimension of a block | 64 |
  • 修改文本中字体颜色大小

    1
    <font color=red size=4>字体颜色大小</font>

    更多颜色看这里.

  • 链接

    1
    [我的主页](https://ashburnlee.github.io/)
  • 另起一行

    1
    表示另起一行</br>
  • 用线划掉

    1
    ~~用横线划掉~~