首页 > 编程技术 > php

php生成二维码中文乱码问题解决方法

发布时间:2016-11-25 17:37

最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个类型没有内容,随即判断没内容就加上一个固定的字符串,这样乱码的问题得以解决。这样解决算是曲线救国吧,不知道怎么根本解决乱码问题,谁得到方法请留言告知,谢谢。

最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个类型没有内容,随即判断没内容就加上一个固定的字符串,这样乱码的问题得以解决。这样解决算是曲线救国吧,不知道怎么根本解决乱码问题,谁得到方法请留言告知,谢谢。


三、 php生成二维码的几种方式

1.google开放api

 代码如下 复制代码

$urlToEncode="http://gz.altmi.com";
generateQRfromGoogle($urlToEncode);
function generateQRfromGoogle($chl,$widhtHeight ='150',$EC_level='L',$margin='0')
{
$url = urlencode($url);
echo '';
}

2.php类库PHP QR Code
地址:http://phpqrcode.sourceforge.net/
下载:http://sourceforge.net/projects/phpqrcode/
用例:

 代码如下 复制代码

# 创建一个二维码文件
QRcode::png('code data text', 'filename.png');
# 生成图片到浏览器
QRcode::png('some othertext 1234');

3.libqrencode
地址:http://fukuchi.org/works/qrencode/index.en.html
php支持请参考:http://hirokawa.netflowers.jp/entry/4900/

4.QRcode Perl CGI & PHP教程 scripts
地址:http://www.swetake.com/qr/qr_cgi.html

四、第2种方法中在二维码中间加上logo

修改phpqrcode.php中的QRimage类里的png方法:

 代码如下 复制代码

public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4, $saveandprint=FALSE, $mergePic='')
{
$image = self::image($frame, $pixelPerPoint, $outerFrame);
if($mergePic) {
$im = imagecreatefrompng($mergePic);
$w = imagesx($im);
$h = imagesy($im);
ImageAlphaBlending($image, true);
ImageAlphaBlending($im, true);
$qrw = (imagesx($image)-$w)/2;
$qrh = (imagesy($image)-$h)/2;
imagecopy($image, $im, $qrw, $qrh, 0, 0, $w, $h);
imagedestroy($im);
}

if ($filename === false) {
Header("Content-type: image/png");
ImagePng($image);
} else {
ImagePng($image, $filename);
if($saveandprint===TRUE){
header("Content-type: image/png");
ImagePng($image);
}
}
ImageDestroy($image);
}

json_encode函数对于中文的处理不友好,如果我们字符为gbk或gb2312编码时会发现转换中文变成了空了,但对于utf-8转换出来的编码是我们看不懂的,下面我来就json_encode对中文字符处理问题的一些解决办法。

1.json_encode()中文在gbk/gb2312中中文返回为null

 代码如下 复制代码

$arr = array ( 

  array ( 

      'catid' => '4', 

      'catname' => 'www.111cn.net', 

      'meta_title' => '一聚教程网2' 

    )
);
 
echo json_encode($arr);

结果

[{"catid":"4","catname":"www.111cn.net","meta_title":null}]

看一了吗"meta_title":null 他本来是有一个值的为一聚教程网2了,这个我们查了一下原理是json_encode只支持uft-8编码,我们转换一下

 代码如下 复制代码
<?php
$data=”JSON中文”;
$newData=iconv(“GB2312″,”UTF-8//IGNORE”,$data);
echo $newData;
//ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符都不会被保存。
//或是(“GB2312″,”UTF-8″,$data);
?>

Step2
后台PHP页面(页面编码为UTF-8或者已经把字符转为UTF-8)使用json_encode将PHP中的array数组转为JSON字符串。例如:

 代码如下 复制代码
<?php
$testJSON=array(‘name’=>’中文字符串’,’value’=>’test’);
echo json_encode($testJSON);
?>
查看输出结果为:
{“name”:”u4e2du6587u5b57u7b26u4e32″,”value”:”test”}


可见即使用UTF8编码的字符,使用json_encode也出现了中文乱码。解决办法是在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode,输出结果的时候在用函数urldecode()转回来。具体如下:

 代码如下 复制代码

<?php
$testJSON=array(‘name’=>’中文字符串’,’value’=>’test’);
//echo json_encode($testJSON);
foreach ( $testJSON as $key => $value ) {
$testJSON[$key] = urlencode ( $value );
}
echo urldecode ( json_encode ( $testJSON ) );
?>

查看输出结果为:

{“name”:”中文字符串”,”value”:”test”}

总结:json_encode函数只能处理uft8字符串,如果是中文估计是对字节处理不好,因为中文gbk与uft长度是不一样的哦,这个我也不深入介绍了。

在使用file_get_contents函数获取远程文件时提示Warning: file_get_contents(): couldn’t resolve错误了,这个我们可以看出是dns的问题,解决办法也简单。


今天在使用一个Caiji功能的使用,突然间出现“

Warning: file_get_contents() [function.file-get-contents]: couldn't resolve host name in ……

而本地测试却没有问题,从网上查了一些资料,发现是dns的问题。下面是解决方法:

用ssh连接linux vps,  修改vps主机的dns。

vi /etc/resolv.conf

里面的内容直接修改成:

nameserver 114.114.114.114

nameserver 8.8.8.8

保存即可,不用重启。

再次测试,OK!

在使用php做后台管理时会碰到用户登录页面会提示Warning: session_start() [function.session-start]: open...错误了,后面跟着是failed: No such file or directory了,这个是告诉我们目录不存了了,下面我来给各位介绍问题解决方案

如我们我的测试111.php文件如下一段代码

<?
session_start();
$_SESSION['admin'] =$_POST['username'];
?>

运行代码提示

Warning: session_start() [function.session-start]: open(/tmpsess_84cb589ea249708b09c3d5e6836fdd0d, O_RDWR) failed: No such file or directory (2) in E:webhtdocswww.111cn.net111.php on line 9 

从上面错误提示是有一句failed: No such file or directory提示了,是告诉我人找不到session缓存要写的目录了,这样我就知道原因所在了

解决办法

SESSION文件保存目录不存在。建一个就行了。  
查看PHP.INI中  
session.save_path   =   /tmp  

改成你要保存的路径如session.save_path = "E:/server/php5/session_temp"

重启服务器即可。

再次运行111.php文件发现没有这个问题了哦,非常的完本站原创 http://www.111cn.net 转载必须注明来源

导入php中文乱码问题一般就是字符集编码问题了,只有字符集编码问题才会导致中文乱码了,这是我总结了所有在php开发中看到中文乱码问题的根本原因了,下面我整理了一些关于php中文乱码问题解决办法与例子,希望能解决各位的朋友哦。

1.mysql+php中文乱码

出现这种问题是数据库连接与网页编码不统一导致了

解决办法

在mysql 连接时我们在后面设置一句

mysql_query("SET NAMES GBK");

例子

在连接数据库的语句中.

 代码如下 复制代码

mysql_connect('localhost','user','password');

mysql_select_db('my_db');

mysql_query("set names 'utf8'"); //select 数据库之后加多这一句

2.PHP中文文件名输出乱码

出现文名乱码是我们环境不支持中文所导致了或编码问题我们只要进行转换字符编码为uft8即可

 代码如下 复制代码

$file_name="我的文件.jpg";
$file_name=iconv("utf-8","gb2312",$file_name);   //解决中文乱码问题
echo '$file_name';

3.json_encode中文乱码问题

1.json_encode UTF8码中文后的字符串不可阅读
2.json_encode 多级数组中文乱码问题
3.json_encode 数组中包含换行时错误问题
4.json_encode 数组中键为中文的问题

 代码如下 复制代码


function _encode($arr)
{
  $na = array();
  foreach ( $arr as $k => $value ) { 
    $na[_urlencode($k)] = _urlencode ($value); 
  }
  return addcslashes(urldecode(json_encode($na)),"rn");
}

function _urlencode($elem)
{
  if(is_array($elem)){
    foreach($elem as $k=>$v){
      $na[_urlencode($k)] = _urlencode($v);
    }
    return $na;
  }
  return urlencode($elem);
}

3.HTML内容编码

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />,这里我们指定了浏览器在解析HTML时使用UTF-8编码 。如果这里没有指定,浏览器会使用自己缺省的编码。不同的浏览器缺省编码会有所不同,比如IE6是GB2312,FireFox是UTF-8。所以,上面这段代码如果没有,在FireFox会显示正常,在IE6就会显示乱码。

4.php内容乱码

在php中我们只要在文件头加上

 代码如下 复制代码

<?php 
header("Content-type:text/html;charset=utf-8"); 

?> 

5.url中文乱码的兼容性

在url地址里出现中文参数,接收页面出现乱码,这个是经常遇到的问题

最基本的解决办法是链接里加上urlencode,接收页面会自动解码或者加上urldecode

但是有时候链接来自多个地方,有的意见urlencode了,有点没有

比如在谷歌浏览器(chrome)地址栏里敲入中文,传递的过程浏览器会自动给你编码

而IE核心缺不然

这就导致同一个接收页面在谷歌浏览器里可以正常显示,而在IE浏览器则是乱码。

解决方法:

 代码如下 复制代码

$keyboard2 = iconv("gb2312","UTF-8",$keyboard);

if($keyboard2)
$keyboard=$keyboard2;

6.htmlentities汉字中文乱码

htmlentities函数作用在汉字变量中的时候会出现乱码
 
$resultsText = str_replace("[QUERY]", htmlentities($(www.111cn.net)query), $resultsText);
 
正确的做法是改变htmlentities的默认参数

htmlentities($query,ENT_COMPAT,'UTF-8')

7.PHP下载文件名中的中文乱码

 代码如下 复制代码

$filename = "中文 文件名.txt";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);

标签:[!--infotagslink--]

您可能感兴趣的文章: