无辜的“联通”:

在windows下打开一个记事本,输入“联通”保存后,再次打开却发现“联通”不见了

首先了解,不同编码文本的存储,开头字节:

UTF-8:                                   EF BB BF

UTF-16/UCS-2,little endian: FF FE

UTF-16/UCS-2,big endian:    FE FF

UTF-32/UCS-4,little endian:  FF FE 00 00

UTF-32/UCS-4,big endian:    00 00 FE FF

“连通”的几种编码:

GBK:                        C1 AA CD A8

UTF-16(big endian):DE 8F 1A 90

UTF-8:                     E8 BF 9E E9 80 9A

打开一个文本要确定它的编码格式有三种途径:

第一:检测文本开头字节(最理想的方法)

第二:猜测,通过读取几个字符测试出可能的编码类型(防止未加格式头)

第三:提示,当打开一个不确定编码类型的文本时可以弹出对话框,让用户来选择(如mail)

其实软件开发中可能三种方法都会用到

Microsoft在采用第二种方法进行打时出错

“联通”的错误出在TXT文件在保存时默认采用ANSI,而当打开时自动猜测成UTF-8打开

所以显示乱码,是猜错引起的。而只要我们以保存的编码方式打开就不会出问题。而“联通”这个编码是个意外

从字符编码角度分析原因:

这应该就是Microsoft程序上的bug了,且至今未找到更好的解决方案(做了优化,即可能是随机多取几字符进行测试 ,所以在“联通”后面如果再多输入几个字符就不会出现乱码了)

先看“联通”的内码(GBK):0xC1AACDA8

C1- 1100 0001

AA- 1010 1010

CD- 1100 1101

A8- 1010 1000

其中一二字节和三四字节中开头都是“110”和“10”,正好与UTF8规则里的双字节模板一致,所以就猜成按UTF-8编码方式打开了

所以只要出现类似“110”和“10”的字符编码,且以ANSI存储,自动打开都会出现乱码的情况,如“联系”和“this app can break” 等等

根据规则统计,一切字符的高字节在C0≤AA≤DF且低字节在80≤BB≤BF这个范围时,notepad都无法确认文档的格式,没有自动依照ANSI格式来显示

而“联通”就是0xC1AACDA8,刚好在上面地范围内,所以不能正常显示,像这样的字符有近二千个

所以说“联通”是无辜的

字库:

是外文字体、中文字体以及相关字符形状的电子文字字体集合,被广泛用于计算机、网络及相关电子产品上

字库分类:

按语种不同可分为:外文字库、中文字库、图形符号库;外文字库又可分为:英文字库、俄文字库、日文字库等等

按不同公司划分为:微软字库、方正字库、汉仪字库、文鼎字库、汉鼎字库、长城字库、金梅字库等等

按历史版本划分,如汉字库:GB字库、GBK字库、GB18030字库等等

按字符字形划分如:宋体、楷体、方正舒体、黑体、MingLiU、Gulim等

按字模存在形式划分为,常见的有:点阵字库、矢量字库、PostScript字库、图形字库等

以GB2312字库举例说明:

为了便于管理GB2312字库,通常采用的是区位码(内码– 0xA0A0)进行检索

假设:有一字符串str,当前字号占s_size字节,求当前字符在字库中的偏移地址offset_addr

s_row = *(str)-0xA0;

s_col = *(str+1)-0xA0;

offset_addr=(94*(s_row-1)+(s_col-1))*s_size;

读取点阵信息到buffer:

fseek(fp,offset_addr,SEEK_SET);

fread(buffer,s_size,1,fp);

6、矢量字体的应用移植:

FreeType 2被设计为一种占用空间小、高效、高度可定制的、并且可以产生可移植的高品质输出(符号图像)。可以被用在诸如图像库、展出服务器、字体转换工具、图像文字产生工具等多种其它产品上

FreeType 2的发行遵循两个开源许可:BSD样式的FreeType License和GPL

它提供一个简单的、易用的并且统一的接口实现对多种字体文件的访问

尽管点阵字体在时间和空间性能上都有较佳的表现,但是由于缺乏灵活性,不便于改变字体的大小和风格

矢量字体不像点阵字体那样直接记录字符的字模数据,而是记录字体描述信息,其中最重要的两部分是outline和hint

       outline(轮廓):这是用来描述字体的基本手段,它一般由直线和贝塞尔曲线组成。贝塞尔曲线是一条由三个点确定的曲线,假设这三点的坐标是(Ax,Ay)、(Bx, By) 和(Cx, Cy),那么曲线方程为:

px = (1-t)2.Ax + 2t(1-t).Bx + t2.Cx
    py = (1-t)2.Ay + 2t(1-t).By + t2.Cy

       hint(精调):Outline已经描述字体的表现形式,但是数学上的正确对人眼来说并不见得合适,特别是缩放到特定的大小和分辨率的时候,字体可能变得不好看,或者不清析。hint指的是一系列的技术,用来微调字体,让字体变得更美观,更清析

       字符影射表(charmap):字符对应的字体数据称为glyph,字体文件中通常带有一个字符映射表,用来把字符映射到对应glyph的索引值

       矢量字体有多种不同的格式,其中TrueType用得最为广泛,它的扩展名通常为OTF或者TTF

       它的文件内容由几部分组成,文件头、表目录和表。文件头描述了版本号和表的数目等信息,表目录记录了表的偏移量和大小,表则是文件的实际数据

       矢量字体的处理比较麻烦,即要进行矢量计算,又要进行精调处理,相对于点阵字体处理要慢

freetype2应用移植:

freetype-2.1.10下载地址:

http://iask.sina.com.cn/u/2487717952/ish

http://savannah.nongnu.org/download/freetype/

编译配置:

       ./configure --host=arm-linux --prefix=/xxx/xxx

make

make install

应用程序的编写:

常用头文件包含:

       #include <ft2build.h>

#include <freetype/freetype.h>

#include <freetype/fttrigon.h>

#include <freetype/ftstroke.h>

应用程序编译:

export   C_INCLUDE_PATH=/home/xiuhai/Desktop/libfree/include/:/home/xiuhai/Desktop/libfree/include/freetype2/

arm-linux-gcc -L/home/xiuhai/Desktop/libfree/lib/ -lfreetype -o t freetype_test.c

运行时要拷贝动态库到开发板lib下,TTY字体库可以拷贝到应用程序指定的位置

当新建一个face对象时,freetype2默认选择Unicode字符表

初始化freetype:

       FT_Library  library;

FT_Init_FreeType( &library );

加载字体创建face:

       FT_Face face;

FT_New_Face(library,"simfang.ttf",0, &face)

设置字体大小(宽/高):

       FT_Set_Pixel_Sizes(face, 16,0)

根据目标编码获取字符在字库中的索引:

       FT_UInt glyph_index;

       glyph_index = FT_Get_Char_Index(face,unicode);

按指定的大小加载字符的glyph:

       FT_Load_Glyph(face,glyph_index,FT_LOAD_DEFAULT)

将指定的glyph转换成bitmap:

       FT_Render_Glyph(face->glyph,FT_RENDER_MODE_MONO)

FT_GlyphSlot结构体部分成员信息:

bitmap_left:距离左边的空余像素

bitmap_top: 用于描述顶部空白区   (bitmap.rows - bitmap_top)

bitmap.rows:字符所占的行数

bitmap.width:字符所占的列数

bitmap.pitch:绝对值表示一行所占字节数

bitmap.pixel_mode:像素模式,1指单色的,8表示反走样灰度值

bitmap.buffer:glyph的点阵位图内存绶冲区

源码实例(用到的字库可以到C:\WINDOWS\Fonts去拷贝)

Freetype2其他应用:

指定字符编码集:

       FT_Select_Charmap(face, FT_ENCODING_GB2312);

字形变换:

       仿射、旋转、文字渲染、缩放、自居调整等

7、多国语言开发:

对于一个嵌入式产品多语言支持,一般分两部分:

       一是终端本地显示界面,如菜单、图标等

       二是来自外部的文件,需要在终端上进行显示

针对上面两点,都离不开Codepage与Unicode,同时还要有支持各国语言的内码表及各国语言内码所对应的字库或Unicode字库

       开发工作主要集中在编码转换和字库索引这块,编码转换方式多样,效率也会不同

对于字符显示的方案:

       对于本地字符串显示,由于内容比较少,可以将字符串定义在头文件中,为了便于随时修改,也可以做成XML文件

       字符串可以是文本也可以是内码(字符串内码数组)

       可以采用各国内码字库,不过得熟悉其编码规则,所以不怎么采用

       一般采用Unicode字库,或TTY字库

       Freetype2为多国语显示提供了很大方便,我们只需要佣用相应语言的TTY字库就可以方便的显示字符了

字符编码、unicode、代码页、矢量字体及多国语开发相关推荐

  1. 【转】刨根究底字符编码之七——ANSI编码与代码页

    一.ANSI编码 1. 如前所述,在全世界所有国家和地区的文字符号统一编码的UCS/Unicode编码方案问世之前(UCS.Unicode后文有详细介绍),各个国家.地区为了用计算机记录并显示自己的字 ...

  2. 字符编码 unicode 及其在javascript 中的使用

    一.javascript 使用 unicode16 字符集,可以使用中文变量名和函数名 计算机使用 8 位(bit)二进制表示一个字节(Byte),计算机内存最小寻址单位就是 1 字节. 早期为了在计 ...

  3. [visual studio 2019] warning C4828: 文件包含在偏移 0x34b 处开始的字符,该字符在当前源字符集中无效(代码页 65001)

    文章目录 警告现象: 解决方案: 1. 文件->高级保存选项,修改编码格式 给文件菜单增加 `"高级保存选项"` 选项 1. 打开 工具->自定义->命令 2. ...

  4. python3 gb2312转utf8_python2和python3字符编码 unicode,utf-8,gb2312相互转换encode,decode...

    一.预习: 1.Unicode 和utf-8之间的关系 unicode是一种编码标准,具体的实现标准可能是utf-8,utf-16,gbk -- UTF-8是Unicode的实现方式之一 2.pyth ...

  5. java字符集与字符编码 Unicode字符集

    字符集与字符编码是两个不同的概念. 字符集,顾名思义就是字符的集合,比如ASCII字符集包含了a-z A-Z 0-9 半角标点符号和特殊控制符号在内的128个符号.对于一个字符集来说,要正确编码转码一 ...

  6. Python笔记:字符编码unicode/utf-8

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. Unicode和Python的中文处理 ...

  7. php代码 编码转换,php字符编码转换代码

    里面有各种大家开发中常用到的种编码如uft8->gbk gbk转utf8 繁体转简体 简体转繁体 utf8转unicode gbk转拼音 Ascii转拼音 等 里面有各种大家开发中常用到的种编码 ...

  8. 字符编码-Unicode等

    oschina上的国栋写过两个系列的文章. 字符集与编码 乱码探源 转载于:https://www.cnblogs.com/Searchor/p/5566940.html

  9. Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...

    一直在说截断,但是并未发现错误,也修改了映射的长度(证明并无卵用),查了下网上说的解决办法,说是改注册表,,修改方法如下: 如果是:Jet引擎. HKEY_LOCAL_MACHINE\SOFTWARE ...

最新文章

  1. Linux那些事儿 之 戏说USB(28)设备的生命线(十一)
  2. [异常特工]android常见bug跟踪
  3. 零基础学Python:作用域详解
  4. 阿里数据:2020七大数据技术领域趋势展望
  5. 【App性能】:TraceView分析法
  6. Axios实现异步通信
  7. 阿联酋起源人工智能研究院(IIAI)诚邀优秀人才加盟
  8. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)
  9. 做图工具pyecharts
  10. php在线电子小说网站毕业设计源码
  11. 从少年变成老男孩-----韩寒与郭敬明的十年
  12. php 支付宝验签失败,支付宝移动支付,服务端对异步通知信息验签的时候验签失败...
  13. 设置android应用闪屏图片_android 闪屏设计
  14. 信安知识竞赛培训笔记
  15. 台式计算机没有声音怎么办,台式电脑没声音怎么回事_台式机电脑没有声音如何解决...
  16. 零基础入门运维必备 | 一文总结学习 Python 的 14 张思维导图
  17. 笔记本当服务器显示器怎么连接,笔记本连接显示器,详细教您笔记本怎么连接显示器...
  18. 建立团队信任的五种方法
  19. 未来流行遛机器狗,也许能解决城市宠物背后的矛盾
  20. 从零开始之驱动发开、linux驱动(六十六、内核调试篇--printk原理)

热门文章

  1. 板式塔操作演示实验装置
  2. android ndk r8 mac,c – 智能指针不适用于Android NDK r8
  3. jenkins + UIAutomation 自动化脚本运行app
  4. 2020第一季度学习总结
  5. 一款宣称提速3-5倍的网络加速软件,大家试试看?
  6. Sybase日期函数
  7. 导航地图分类隐私政策
  8. 2021年T电梯修理考试及T电梯修理考试试卷
  9. Php解压pako,Swoole WebSoctet 使用 zlib 压缩之 PHP 与 pako.js
  10. MAC地址飘移查看及解决方法 一般是网络中存在环路