技术交流

php 汉字 机内码

php 函数
pack 将编码转化为汉字
unpack将汉字转化为编码

» 阅读全文

用php读取汉字点阵数据的方法

下面先普及一下基本知识:

    什么是区位码?

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

    什么是内码?

    汉字的内码是指在计算机中表示汉字的编码.机内码与区位码稍有区别.为什么不直接用区位码作为计算机内的编码呢? 这是因为汉字的区码和位码的范围都在1到94内, 如果直接用区位码作机内码, 就会与基本ASCII码冲突. 汉字的内码通常与所使用的计算机系统有关.目前,对于国内大多数的计算机系统,一个汉字的内码占两个字节,分别称为高位字节与低位字节,且这两位字节与区位码的关系如下: 内码高位=区码+A0H(H表示十六进制) 内码低位=位码+A0H 例如,汉字“啊”的区位码为“1601″,区码和位码分别用十六进制表示即为”1001H“,则它的内码为”B0A1H“.其中B0H为内码的高位字节,A1H为内码的低位字节.

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

    PHP代码:返回由0和1组成的字符串.

    <?PHP

    $str = ”php自学网“ ;

    $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 ;

    ?>

    其中包括两个点阵字体文件:一个为16×16的chs16.fon,另一个为12×12的simsun12.fon,偏移均为零.

php获取照片exif信息的函数

   /**
  * 获取图象信息的函数
  *
  * 一个全面获取图象信息的函数
  *
  * @access public
  * @param string $img 图片路径
  * @return array
  */
  function GetImageInfoVal($ImageInfo,$val_arr) {
  $InfoVal = "未知";
  foreach($val_arr as $name=>$val) {
  if ($name==$ImageInfo) {
  $InfoVal = &$val;
  break;
  }
  }
  return $InfoVal;
  }
  function GetImageInfo($img) {
  
  
  
  $imgtype = array("", "GIF", "JPG", "PNG", "SWF", "PSD", "BMP", "TIFF(intel byte order)", "TIFF(motorola byte order)", "JPC", "JP2", "JPX", "JB2", "SWC", "IFF", "WBMP", "XBM");
  $Orientation = array("", "top left side", "top right side", "bottom right side", "bottom left side", "left side top", "right side top", "right side bottom", "left side bottom");
  $ResolutionUnit = array("", "", "英寸", "厘米");
  $YCbCrPositioning = array("", "the center of pixel array", "the datum point");
  $ExposureProgram = array("未定义", "手动", "标准程序", "光圈先决", "快门先决", "景深先决", "运动模式", "肖像模式", "风景模式");
  $MeteringMode_arr = array(
  "0" => "未知",
  "1" => "平均",
  "2" => "中央重点平均测光",
  "3" => "点测",
  "4" => "分区",
  "5" => "评估",
  "6" => "局部",
  "255" => "其他"
  );
  $Lightsource_arr = array(
  "0" => "未知",
  "1" => "日光",
  "2" => "荧光灯",
  "3" => "钨丝灯",
  "10" => "闪光灯",
  "17" => "标准灯光A",
  "18" => "标准灯光B",
  "19" => "标准灯光C",
  "20" => "D55",
  "21" => "D65",
  "22" => "D75",
  "255" => "其他"
  );
  $Flash_arr = array(
  "0" => "flash did not fire",
  "1" => "flash fired",
  "5" => "flash fired but strobe return light not detected",
  "7" => "flash fired and strobe return light detected",
  );
  
  $exif = exif_read_data ($img,"IFD0");
  if ($exif===false) {
  $new_img_info = array ("文件信息" => "没有图片EXIF信息");
  }
  else
  {
  $exif = exif_read_data ($img,0,true);
  $new_img_info = array (
  "文件信息" => "-----------------------------",
  "文件名" => $exif['FILE']['FileName'],
  "文件类型" => $imgtype[$exif['FILE']['FileType']],
  "文件格式" => $exif['FILE']['MimeType'],
  "文件大小" => $exif['FILE']['FileSize'],
  "时间戳" => date("Y-m-d H:i:s",$exif['FILE']['FileDateTime']),
  "图像信息" => "-----------------------------",
  "图片说明" => $exif['IFD0']['ImageDescription'],
  "制造商" => $exif['IFD0']['Make'],
  "型号" => $exif['IFD0']['Model'],
  "方向" => $Orientation[$exif['IFD0']['Orientation']],
  "水平分辨率" => $exif['IFD0']['XResolution'].$ResolutionUnit[$exif['IFD0']['ResolutionUnit']],
  "垂直分辨率" => $exif['IFD0']['YResolution'].$ResolutionUnit[$exif['IFD0']['ResolutionUnit']],
  "创建软件" => $exif['IFD0']['Software'],
  "修改时间" => $exif['IFD0']['DateTime'],
  "作者" => $exif['IFD0']['Artist'],
  "YCbCr位置控制" => $YCbCrPositioning[$exif['IFD0']['YCbCrPositioning']],
  "版权" => $exif['IFD0']['Copyright'],
  "摄影版权" => $exif['COMPUTED']['Copyright.Photographer'],
  "编辑版权" => $exif['COMPUTED']['Copyright.Editor'],
  "拍摄信息" => "-----------------------------",
  "Exif版本" => $exif['EXIF']['ExifVersion'],
  "FlashPix版本" => "Ver. ".number_format($exif['EXIF']['FlashPixVersion']/100,2),
  "拍摄时间" => $exif['EXIF']['DateTimeOriginal'],
  "数字化时间" => $exif['EXIF']['DateTimeDigitized'],
  "拍摄分辨率高" => $exif['COMPUTED']['Height'],
  "拍摄分辨率宽" => $exif['COMPUTED']['Width'],
  /*
  The actual aperture value of lens when the image was taken.
  Unit is APEX.
  To convert this value to ordinary F-number(F-stop),
  calculate this value's power of root 2 (=1.4142).
  For example, if the ApertureValue is '5', F-number is pow(1.41425,5) = F5.6.
  */
  "光圈" => $exif['EXIF']['ApertureValue'],
  "快门速度" => $exif['EXIF']['ShutterSpeedValue'],
  "快门光圈" => $exif['COMPUTED']['ApertureFNumber'],
  "最大光圈值" => "F".$exif['EXIF']['MaxApertureValue'],
  "曝光时间" => $exif['EXIF']['ExposureTime'],
  "F-Number" => $exif['EXIF']['FNumber'],
  "测光模式" => GetImageInfoVal($exif['EXIF']['MeteringMode'],$MeteringMode_arr),
  "光源" => GetImageInfoVal($exif['EXIF']['LightSource'], $Lightsource_arr),
  "闪光灯" => GetImageInfoVal($exif['EXIF']['Flash'], $Flash_arr),
  "曝光模式" => ($exif['EXIF']['ExposureMode']==1?"手动":"自动"),
  "白平衡" => ($exif['EXIF']['WhiteBalance']==1?"手动":"自动"),
  "曝光程序" => $ExposureProgram[$exif['EXIF']['ExposureProgram']],
  /*
  Brightness of taken subject, unit is APEX. To calculate Exposure(Ev) from BrigtnessValue(Bv), you must add SensitivityValue(Sv).
  Ev=Bv+Sv Sv=log((ISOSpeedRating/3.125),2)
  ISO100:Sv=5, ISO200:Sv=6, ISO400:Sv=7, ISO125:Sv=5.32.
  */
  "曝光补偿" => $exif['EXIF']['ExposureBiasValue']."EV",
  "ISO感光度" => $exif['EXIF']['ISOSpeedRatings'],
  "分量配置" => (bin2hex($exif['EXIF']['ComponentsConfiguration'])=="01020300"?"YCbCr":"RGB"),//'0x04,0x05,0x06,0x00'="RGB" '0x01,0x02,0x03,0x00'="YCbCr"
  "图像压缩率" => $exif['EXIF']['CompressedBitsPerPixel']."Bits/Pixel",
  "对焦距离" => $exif['COMPUTED']['FocusDistance']."m",
  "焦距" => $exif['EXIF']['FocalLength']."mm",
  "等价35mm焦距" => $exif['EXIF']['FocalLengthIn35mmFilm']."mm",
  /*
  Stores user comment. This tag allows to use two-byte character code or unicode. First 8 bytes describe the character code. 'JIS' is a Japanese character code (known as Kanji).
  '0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00':ASCII
  '0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00':JIS
  '0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00':Unicode
  '0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00':Undefined
  */
  "用户注释编码" => $exif['COMPUTED']['UserCommentEncoding'],
  "用户注释" => $exif['COMPUTED']['UserComment'],
  "色彩空间" => ($exif['EXIF']['ColorSpace']==1?"sRGB":"Uncalibrated"),
  "Exif图像宽度" => $exif['EXIF']['ExifImageLength'],
  "Exif图像高度" => $exif['EXIF']['ExifImageWidth'],
  "文件来源" => (bin2hex($exif['EXIF']['FileSource'])==0x03?"digital still camera":"unknown"),
  "场景类型" => (bin2hex($exif['EXIF']['SceneType'])==0x01?"A directly photographed image":"unknown"),
  "缩略图文件格式" => $exif['COMPUTED']['Thumbnail.FileType'],
  "缩略图Mime格式" => $exif['COMPUTED']['Thumbnail.MimeType']
  );
  }
  return $new_img_info;
  }
  
  $innerhtml = "";
  $exif = GetImageInfo($_GET['img']);
  $innerhtml .= "";
  
  foreach($exif as $name=>$val) {
  $innerhtml .= "";
  }
  
  $innerhtml .= "
";
  if ($_GET['img']) {
  $image = exif_thumbnail($_GET['img']);
  } else {
  $image = false;
  }
  if ($image!==false) {
  $innerhtml .= "";
  } else {
  // no thumbnail available, handle the error here
  $innerhtml .= "No thumbnail available";
  }
  
  $innerhtml .= "
";
  print_r($exif);
  ?>

正则表达式里面的修饰符

在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着"e"并不等于"E")。正则表达式里面的修饰符如下:
i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。
m:默认的正则开始"^"和结束"$"只是对于正则字符串,如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。
s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
U:和问号的作用差不多,用于设置"贪婪模式"。

PHP中文件操作判断函数对比(file_exists() VS is_readable() VS is_file())

使用PHP操作文件时,我们经常用到三个函数:file_exists(),is_readable()和is_file()。他们的确切含义如下:
1,file_exists()

如果文件存在返回True,否则返回False。但这里的文件即可以是一个实体文件,也可以是一个目录文件。

2,is_readable()

如果文件存在并且状态为可读返回True,否则返回False。这个函数与file_exists()类似,目标即可以是实体文件也可以是目录文件。

3.is_file()

也许鉴于以上两个函数的泛性判断,所以才会有is_file()函数,这个函数用来判断目标是否是一个实体文件。于is_file()函数对应的是is_dir()函数,他用来判断目标是否是一个目录文件。

PHP的$_SERVER['HTTP_HOST']获取服务器地址功能详解

在php中,我们一般通过$_SERVER['HTTP_HOST']来活得URL中网站的域名或者ip地址。

php手册中的解释如下:

“HTTP_HOST”
当前请求的 Host: 头信息的内容。 

一般来说,这样子不会遇到什么问题,在一些常见的php框架中,如PFC3和FLEA也是基于该预定义变量。

然而最近在做的一个项目,程序移交到客户手里测试时,竟然发现程序的跳转总是会出错。

最后找出原因:$_SERVER['HTTP_HOST']在客户的环境里,取得的值总是程序所在的服务器在其局域网内的ip值。

究其原因,是因为,客户的公司通过一台服务器连接至因特网,而我们的程序所在的服务器,是通过域名映射出来的,也就是中间有个“代理”的过程。因此$_SERVER['HTTP_HOST']在这样的环境里,取得的值总是程序所在的服务器在其局域网内的ip值。

最后查了不少资料,在symfony框架里面,找到替代的实现方法:

将$host = $_SERVER['HTTP_HOST'];

替换成:

$host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');

即可。

PHP 获取图片的拍摄相机型号、拍摄时间

本插件需要服务器具备EXIF扩展和mbstring扩展,而且mbstring扩展必须在EXIF扩展之前加载。

 

服务器配置说明:

1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号

2.在php.ini文件中找到;extension=php_mbstring.dll,去掉前面的分号,并将此行移动到extension=php_exif.dll之前

3.找到[exif]段,把下面语句的分号去掉。

;exif.encode_unicode = ISO-8859-15

;exif.decode_unicode_motorola = UCS-2BE

;exif.decode_unicode_intel    = UCS-2LE

;exif.encode_jis =

;exif.decode_jis_motorola = JIS

;exif.decode_jis_intel    = JIS

 

不同的人可能需要不同的EXIF信息,下面这一段大家可以根据需要选用:

"文件名"                =>        $exif[FILE][FileName],

"文件类型"                =>        $imgtype[$exif[FILE][FileType]],

文件格式"                =>        $exif[FILE][MimeType],

"文件大小"                =>        $exif[FILE][FileSize],

"时间戳"                =>        date("Y-m-d H:i:s",$exif[FILE][FileDateTime]),

"图片说明"                =>        $exif[IFD0][ImageDescription],

"制造商"                =>        $exif[IFD0][Make],

"型号"                =>        $exif[IFD0][Model],

"方向"                =>        $Orientation[$exif[IFD0][Orientation]],

"水平分辨率"        =>        $exif[IFD0][XResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],

"垂直分辨率"        =>        $exif[IFD0][YResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],

"创建软件"                =>        $exif[IFD0][Software],

"修改时间"                =>        $exif[IFD0][DateTime],

"作者"                        =>        $exif[IFD0][Artist],

"YCbCr位置控制"        =>        $YCbCrPositioning[$exif[IFD0][YCbCrPositioning]],

"版权"                        =>        $exif[IFD0][Copyright],

"摄影版权"                =>        $exif[COMPUTED][Copyright.Photographer],

"编辑版权"                =>        $exif[COMPUTED][Copyright.Editor],

"Exif版本"                =>        $exif[EXIF][ExifVersion],

"FlashPix版本"        =>        "Ver. ".number_format($exif[EXIF][FlashPixVersion]/100,2),

"拍摄时间"                =>        $exif[EXIF][DateTimeOriginal],

"数字化时间"        =>        $exif[EXIF][DateTimeDigitized],

"拍摄分辨率高"        =>        $exif[COMPUTED][Height],

"拍摄分辨率宽"        =>        $exif[COMPUTED][Width],

"光圈"                        =>        $exif[EXIF][ApertureValue],

"快门速度"                =>        $exif[EXIF][ShutterSpeedValue],

"快门光圈"                =>        $exif[COMPUTED][ApertureFNumber],

"最大光圈值"        =>        "F".$exif[EXIF][MaxApertureValue],

"曝光时间"                =>        $exif[EXIF][ExposureTime],

"F-Number"                =>        $exif[EXIF][FNumber],

"测光模式"                =>        GetImageInfoVal($exif[EXIF][MeteringMode],$MeteringMode_arr),

"光源"                        =>        GetImageInfoVal($exif[EXIF][LightSource], $Lightsource_arr),

"闪光灯"                =>        GetImageInfoVal($exif[EXIF][Flash], $Flash_arr),

"曝光模式"                =>        ($exif[EXIF][ExposureMode]==1?"手动":"自动"),

"白平衡"                =>        ($exif[EXIF][WhiteBalance]==1?"手动":"自动"),

"曝光程序"                =>        $ExposureProgram[$exif[EXIF][ExposureProgram]],

"曝光补偿"                =>        $exif[EXIF][ExposureBiasValue]."EV",

"ISO感光度"                =>        $exif[EXIF][ISOSpeedRatings],

" 分量配置"                =>        (bin2hex($exif[EXIF][ComponentsConfiguration])=="01020300"?"YCbCr":"RGB"),//'0x04,0x05,0x06,0x00'="RGB" '0x01,0x02,0x03,0x00'="YCbCr"

"图像压缩率"        =>        $exif[EXIF][CompressedBitsPerPixel]."Bits/Pixel",

"对焦距离"                =>        $exif[COMPUTED][FocusDistance]."m",

"焦距"                        =>        $exif[EXIF][FocalLength]."mm",

"等价35mm焦距"        =>        $exif[EXIF][FocalLengthIn35mmFilm]."mm",


PhpExcel中文帮助手册|PhpExcel使用方法

下面是总结的几个使用方法

include 'PHPExcel.php';
include 'PHPExcel/Writer/Excel2007.php';
//或者include 'PHPExcel/Writer/Excel5.php'; 用于输出.xls的
创建一个excel
$objPHPExcel = new PHPExcel();

保存excel—2007格式
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
//或者$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); 非2007格式
$objWriter->save("xxx.xlsx");

» 阅读全文