PHP读取汉字的点阵数据


Posted in PHP onJune 22, 2015

项目中遇到的问题:

PHP如何读取汉字的点阵数据?想实现输入一段文字,能得到这一段文字的所有点阵码。

解决方法:

简体中文国标字库7445个字符,其中汉字6773个,包括一级汉字3755个,二级汉字3008个。采用2字节(16位二进制)编码。

区位码:国标GB2312规定,所有的国标汉字与符号组成一个94×94的矩阵。在此方阵中,每一行称为一个”区”,每一列称为一个”位”,因此,这个方阵实际上组成了一个有94个区(区号分别为0 1到94)、每个区内有94个位(位号分别为01到94)的汉字字符集。一个汉字所在的区号和位号简单地组合在一起就构成了该汉字的”区位码”。在汉字的区位码中,高两位为区号,低两位为位号。由此可见,区位码与汉字或符号之间是一一对应的。

内码:汉字的内码是指在计算机中表示汉字的编码。机内码与区位码稍有区别。目前,对于国内大多数的计算机系统,一个汉字的内码占两个字节,分别称为高位字节与低位字节,且这两位字节与区位码的关系如下: 内码高位=区码+A0H(H表示十六进制) 内码低位=位码+A0H 例如,汉字”啊”的区位码为”1601″,区码和位码分别用十六进制表示即为”1001H”,则它的内码为”B0A1H”。其中B0H为内码的高位字节,A1H为内码的低位字节。

返回由0和1组成的字符串

<?php
/**
* 读取汉字点阵数据
*
*/

$str = "中华人民共和国";

$font_file_name = "simsun12.fon"; // 点阵字库文件名
$font_width = 12; // 单字宽度
$font_height = 12; // 单字高度
$start_offset = 0; // 偏移

$fp = fopen($font_file_name, "rb");

$offset_size = $font_width * $font_height / 8;
$string_size = $font_width * $font_height;
$dot_string = "";

for ($i = 0; $i < strlen($str); $i ++)
{
if (ord($str{$i}) > 160)
{
// 先求区位码,然后再计算其在区位码二维表中的位置,进而得出此字符在文件中的偏移
$offset = ((ord($str{$i}) - 0xa1) * 94 + ord($str{$i + 1}) - 0xa1) * $offset_size;
$i ++;
}
else
{
$offset = (ord($str{$i}) + 156 - 1) * $offset_size;
}

// 读取其点阵数据
fseek($fp, $start_offset + $offset, SEEK_SET);
$bindot = fread($fp, $offset_size);

for ($j = 0; $j < $offset_size; $j ++)
{
// 将二进制点阵数据转化为字符串
$dot_string .= sprintf("%08b", ord($bindot{$j}));
}
}

fclose($fp);

echo $dot_string;
?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 PHP
php中生成随机密码的自定义函数代码
Oct 21 PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
php中静态类与静态变量用法的区别分析
Jan 15 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
两种php给图片加水印的实现代码
Apr 18 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
Laravel5.7 数据库操作迁移的实现方法
Apr 12 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 PHP
php读取der格式证书乱码解决方法
Jun 22 #PHP
PHP aes (ecb)解密后乱码问题
Jun 22 #PHP
php实现对象克隆的方法
Jun 20 #PHP
php判断对象是派生自哪个类的方法
Jun 20 #PHP
php类的扩展和继承用法实例
Jun 20 #PHP
php传值赋值和传地址赋值用法实例分析
Jun 20 #PHP
php多重接口的实现方法
Jun 20 #PHP
You might like
最小化数据传输――在客户端存储数据
2006/10/09 PHP
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
php单例模式实现方法分析
2015/03/14 PHP
php筛选不存在的图片资源
2015/04/28 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
vue axios用法教程详解
2017/07/23 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
python实现异步回调机制代码分享
2014/01/10 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
365 Tickets英国:全球景点门票
2019/07/06 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
北京振戎融通Java面试题
2015/09/03 面试题
周年庆典邀请函范文
2014/01/23 职场文书
服务标语口号
2014/07/01 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
解除处分决定书
2015/06/25 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫