文件编码学习笔记

几种常见的编码

  1. ASCII:ASCII算是我们最早接触的一个编码,记得学C语言的char类型时候就开始认识它了,它的范围是0-127,它除了包含所有的英文字母和英文标点符号外还有一些不可打印的控制符号,比如制表符(0x9)、换行符(0xA)等等。
  2. GB2312:从上面可知,ASCII编码只有0-127的范围,而我们中国的汉字博大精深,经过几千年的历史和文化沉淀,常用的汉字也有好几千个,所以ASCII根本不能容纳,所以在1981年中国国家标准总局发布了一套国家标准-GB2312,包含了6763个汉字和682个非汉字图形字符,它所收录的汉字已经覆盖了中国大陆99.75%的使用频率。在使用GB2312的程序中,通常采用CUC存储方法,以便兼容ASCII,所以中文字符占用两个字节,而英文字符占用一个字节。
  3. GBK: GBK作为GB2312的扩充,增加了1万4千多个字,完全兼容GB2312。并且还包含了中日韩汉字和BIG5中的汉字。同样采用两个字节来存放一个汉字。
  4. GB18030: 一种比GBK更多字符的编码,采用单字节、双字节、四字节三种方式对字符编码。
  5. BIG5: 一种通行于台湾、香港地区的一个繁体字编码方案。也采用两个字节来存放一个字。
  6. UTF-8: 是Unicode的实现之一。它是一种变长的编码方式,可以使用1~4个字节(理论可达到6字节)来表示符号,其中ASCII符号用1个字节来保存,中文符号用3个字节保存,而且它是字节序无关的。
  7. UTF-16: 也是Unicode的一种实现方式之一。它把大多数的字符都用2字节存储,因此它无法兼容于ASCII编码,另外,UTF-16和UCS-2的关系是:UTF-16可看成是UCS-2的父集。UTF-16是与字节序有关的,一般会在UTF-16编码的文件首部放FFFE表示小字端存储,FEFF为大字端存储。

文件编码转换

可以使用iconv开源库来转换文件之间的编码(在Linux下安装iconv)

例如:把编码为gb18030的test.txt转换为utf8编码,并把结果存为utf8.txt
$> iconv -f gb18030 -t utf8 gb18030.txt > utf8.txt

Tips:-f表示from,-t表示to

C++11对UTF8的支持

// 把utf8的字符串,转换为utf16的字符串,其中u8_str的字符如果有中文,则该中文字符是3个字节,
// 转换为u16_str后是两个字节
wstring_convert<codecvt_utf8_utf16<char16_t>, char16_t> convert;
std::u16string u16_str = convert.from_bytes(u8_str);

iconv判断文件是否是某个编码

#!/bin/sh
isEncode()
{
    if
        `iconv -f $1 -t utf8 $2 1>/dev/null 2>/dev/null`
    then
        return 0
    else
        return -1
    fi
}

if
    isEncode $1 $2
then
    echo "$2 is $1"
else
    echo "$2 is not $1"
fi

把上面代码保存为isEncode.sh文件,然后执行

$ ./isEncode gb2312 test.txt
123.txt is gb2312

该命令测试test.txt的编码是否是gb2312

猜你喜欢

转载自blog.csdn.net/LYH66/article/details/50058345