首页 > 编程技术 > php

PHP的 GB2312-UTF-8 转换函数

发布时间:2016-11-25 16:33

以下是一段gb2312 -> UTF-8 的函数,我抄了
unicode -> UTF-8 的算法,所以实际比GB2312->unicode
没多多少东西,请大家注意调用gb2utf8()时不能中英文混用
程序需要的GB2312.txt文件
<?
//Program writen by sadly www.phpx.com
//gb2utf8.php
function gb2utf8($gb)
{
if(!trim($gb))
return $gb;
$filename="gb2312.txt";
$tmp=file($filename);
$codetable=array();
while(list($key,$value)=each($tmp))
$codetable[hexdec(substr($value,0,6))]=substr($value,7,6);
$utf8="";
while($gb)
{
if (ord(substr($gb,0,1))>127)
{
$this=substr($gb,0,2);
$gb=substr($gb,2,strlen($gb));
$utf8.=u2utf8(hexdec($codetable[hexdec(bin2hex($this))-0x8080]));
}
else
{
$gb=substr($gb,1,strlen($gb));
$utf8.=u2utf8(substr($gb,0,1));
}
}
$ret="";
for($i=0;$i<strlen($utf8);$i+=3)
$ret.=chr(substr($utf8,$i,3));
return $ret;
}
function u2utf8($c)
{
for($i=0;$i<count($c);$i++)
$str="";
if ($c < 0x80) {
$str.=$c;
}
else if ($c < 0x800) {
$str.=(0xC0 $c>>6);
$str.=(0x80 $c & 0x3F);
}
else if ($c < 0x10000) {
$str.=(0xE0 $c>>12);
$str.=(0x80 $c>>6 & 0x3F);
$str.=(0x80 $c & 0x3F);
}
else if ($c < 0x200000) {
$str.=(0xF0 $c>>18);
$str.=(0x80 $c>>12 & 0x3F);
$str.=(0x80 $c>>6 & 0x3F);
$str.=(0x80 $c & 0x3F);
}
return $str;
}
?>
调用举例:通过GD输出 "中国" 两个汉字
example.php
<?
//Header("Content-type: image/gif");
$im = imagecreate(400,300);
$bkg = ImageColorAllocate($im, 0,0,0);
$clr = ImageColorAllocate($im, 255,255,255);
$fnt = "d:/winnt/fonts/simhei.ttf";
include("gb2utf8.php");
$str = gb2utf8("中国");
ImageTTFText($im, 20, 0, 10, 20, $clr, $fnt, $str);
ImageGif($im);
ImageDestroy($im);
?>
====================================

下面列出了当前在 PCRE 中可能使用的修正符。括号中是这些修正符的内部 PCRE 名。
 






P>对 PHP 之 函数 sprintf() 的学习研究笔记
sprintf
将字串格式化。
语法: string sprintf(string format, mixed [args]...);
传回值: 字串
函式种类: 资料处理
 
内容说明
本函式用来将字串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
1. 填空字元。0 的话表示空格填 0;空格是内定值,表示空格就放着。
2. 对齐方式。内定值为向右对齐,负号表向左对齐。
3. 栏位宽度。为最小宽度。
4. 精确度。指在小数点后的浮点数位数。
型态,见下表
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
转换字符
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
% 印出百分比符号,不转换。
b 整数转成二进位。
c 整数转成对应的 ASCII 字元。
d 整数转成十进位。
f 倍精确度数字转成浮点数。
o 整数转成八进位。
s 整数转成字串。
x 整数转成小写十六进位。
X 整数转成大写十六进位。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
例子
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
使用范例
<?
$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
// 此时变数 $money 值为 "123.1";
$formatted = sprintf ("%01.2f", $money);
// 此时变数 $ formatted 值为 "123.10"
?>
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
这个 %01.2f 是什么意思呢?
首先 这个 % 符号是开始的意思,他写在最前面表示指定格式要开始了。
 也就是 "起始字符", 直到出现 "转换字符" 为止,就算格式终止。
然后 跟在 % 符号 后面的是 0 这个零是 "填空字元" 表示,如果位置空着 就用0来填满。
在 0 后面的是 1 这个 1 是规定,小数点前面的数字占位要有1位以上。
如果把 1 改成 2 如果 $money 的值为 1.23 ,则 $formatted 的值将为 01.23
因为,在小数点前面的数字只占了1位,按照上面所规定的格式,小数点前数字应该占2位,现在只有1位,所以,用0来填满。
到目前,在 %01 后面的 .2 (点2) 就很好理解了,它的意思是,规定,小数点后的数字,必需占2位. 如果这时候,$money 的值为 1.234,则 $formatted 的值将为 1.23。
树型目录看起来新颖别致,而网上的大多是JAVASCRIPT和PHP的结合,本人这一个是用全用PHP4写的,用了SESSION功能,请大家看了多提意见。(本人在WIN98/PWS/PHP4下测试通过)
<?
// 2001/02/23
//ZHANGHEXUN
//树型目录
session_start(); //开始一个SESSION
if (!session_is_registered("$office_action")){
$office_action=0;
session_register("$office_action");//注册一个SESSION
}
if(!session_is_registered("$pho_action")){
$pho_action=0;
session_register("$pho_action");
}
if (!session_is_registered("$web_action")){
$web_action=0;
session_register("$web_action");
}
$office=array('wps','office2000','北大方正'); //办公之星项目
$pho=array('photoshop','3D MAX','fish','Firworks');
$web=array('php','asp','jsp','html','javascript','perl');
?>
<HTML><HEAD><TITLE>张贺勋的树型目录</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type></HEAD>
<BODY>
<TABLE border=0 width="100%" bgcolor=#8cc9ec cellpadding=1 cellspacing=1>
<TBODY>
<TR>
<TD width=180 bgcolor=#8cc9ec>
<TABLE>
<TR><TD><FONT class=font6>学习中心</FONT></TD></TR>
<TR><TD>·<A href=<?
if ($acte==1000){
$office_action= 1-$office_action;
}
print ""$php_self?acte=1000&office_action=$office_action"";
?>>办公之星</a><br>
<?if ($office_action==1){
print"<talbe> <tbody> <tr> ";
for ($i=0;$i<count($office);$i++){
print"<td>&nbsp&nbsp&nbsp|-<a href="$php_self?acte=".(1005+$i*5)."">$office[$i]</a></td></tr>";
}
print"</tbody></table> ";
大家在使用诸如yourname.yeah.net这样的简记域名时都感到十分方便,有很多人在想:我要是能让自己的服务器也能够实现简记域名就好了。其实这并不复杂。看完了本文,你也可以做一个简记域名系统。
  简记域名系统的关键技术在于:实现Web页面的重定向(Redirctory)。在本质上,简记域名系统和虚拟机系统完全不同。虚拟机的虚拟域名和IP是存在一一对应关系的。而简记域名系统不需要将域名和IP做一一映射。也就是说,它根本不需要复杂的域名解析机制和虚拟机来完成,它所做的事情就是当你在请求yourname.somedomain时,将你的浏览器重新定向到你本来存放Html页面的地方。
  为了说明的更完善,下面图例:
  我提供的源程序是运行环境是:RedHat 5.1 Linux下的Apache1.3.6 Web服务器+PHP3语言。
 在编写程序之前,我们首先要设置好我们的服务器。首先要让Apache服务器支持php3。到ftp.redhat.com下载mod_php-2.0.1-9.i386.rpm,安装后,修改/etc/httpd/conf/http.conf文件,去掉
  设置DNS服务器,使其能对泛域名解析。一般的Unix和Linux系统的DNS解析都是由Bind守护程序完成的,Bind4和Bind8的配置文件分别/etc/named.boot和name.conf,配置时根据你的系统修改。设置Bind的配置文件/etc/named.boot,在其中加入“primary domain.com db.domain”一句,添加一个新的域记录。在/etc/name.conf中加入:
  zone "domain.com" {
  type master;
  file "db.domain”;
  };
  在/var/name/中新建主域记录文件db.domain,其格式为:
  N SOA dns.domain.com root.domain.com (
  199811291 ;Serial
  28800 ;refresh
  7200 ;retry
  604800 ;expire
  86400) ;minimum
  dns
  MX 10 dns.domain.com.
  dns A 202.115.135.50
  www A 202.115.135.50
  * A 202.115.135.50
  关键是最后一句,即将整个域可能出现未做标记的所有Hostname全部指向同一IP。
 执行/usr/sbin/ndc reload,重新加载域名数据库。测试一下,此时应该随便ping一个domain域内的主机(除已经标记的),都指向了指定的IP,那么DNS服务器设置完成。
  最后一步是编制PHP3脚本。我们刚才已经在图中详细的说明了整个的原理,所以写一个重新定向的程序就不是很难了。
标签:[!--infotagslink--]