请问我如何判断一个字符串是什么编码,也就是说,比如得到一个字符串,在PHP中我如何判断它是GB2312还是utf-8编码

时间:2022-03-01 10:35:57
比如得到一个字符串,在PHP中我如何判断它是GB2312还是utf-8编码

15 个解决方案

#1


有有明显的标识 =?gb2312?B? 或者 =?utf-8? 。字符串查找就是了。由于系统的不通,注意忽略大小写。

=?gb2312?B?Rn........==?=

#2


一个字符是什么编码取决于你发送的时候采用的什么编码,

#3


iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "ISO-8859-1");
var_dump(iconv_get_encoding('all'));
用iconv_get_encoding all可以略
可以取得你当前用的编码

#4


谢谢楼上的几位大哥!我目前的问题是这样的,我有一个页面,需要把上一页传过来的变量保存!但我不知道用户浏览器的编码格式,如果用户的编码格式是“utf-8"那么传过来的变量我就需要用iconv转成gb2312后再保存,如果用户的编码格式是“gb2312",那么传过来后我就不需要再用iconv来转了,所以我就要判断用户传过来的变量到底是什么编码格式,再决定是否用iconv

#5


你统一用UTF8来处理就行吧,兼容gb2312的,并且你也不用专门去识别,Apache已经帮你转换了啊

#6


我用IIS,请 diekiss(峯) 说的具体一点

#7


没人回答了吗?

#8


需要把上一页传过来的变量保存!

你上一页编码用的是什么,传过来的变量就是什么编码!

#9


用户可以改变浏览器的字符编码呢~~

#10


顶一下

#11


这样判断:
在除去半角字符后的串中,
1、全部字节都大于0xa0,可视为gb2312编码的
2、所有奇数字节大于等于0x81、偶数字节大于等于0x40可视为gbk编码
3、当串中各字节按如下规律排列时可视为utf-8编码
一个>=0xc2的字节和若干个0x80-0xbf的字节为一组

以上是从编码规则上进行判断的,当相关编码转换的函数可用的时候可以通过辗转变换来判断
思路是,当一个gb2312的字符经gb2312-utf-8转换到utf-8编码后是可以经utf-8-gb2312转换回来的
而一个utf-8字符做同样的操作就不能回到原来的样子了

#12


晕,有这么复杂嘛?

#13


linux 下需要安装iconv模块的,php安装时同时编译上.

#14


今天我碰到同样的问题,写了下面这个函数来解决,确实是简单了点,有些不负责任的感觉,但是效果达到了,也就先这么着呗,哈哈哈哈....

function getSafeCode($value)
{
$value_1= $value;
$value_2 = @iconv("utf-8","gb2312",$value_1);
$value_3 = @iconv("gb2312","utf-8",$value_2);

if (strlen($value_1) == strlen($value_3))
{
return $value_2;
}else
{
return $value_1;
}
}

#15


等了这么长时间,终于有人可以回答了! 结帖

#1


有有明显的标识 =?gb2312?B? 或者 =?utf-8? 。字符串查找就是了。由于系统的不通,注意忽略大小写。

=?gb2312?B?Rn........==?=

#2


一个字符是什么编码取决于你发送的时候采用的什么编码,

#3


iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "ISO-8859-1");
var_dump(iconv_get_encoding('all'));
用iconv_get_encoding all可以略
可以取得你当前用的编码

#4


谢谢楼上的几位大哥!我目前的问题是这样的,我有一个页面,需要把上一页传过来的变量保存!但我不知道用户浏览器的编码格式,如果用户的编码格式是“utf-8"那么传过来的变量我就需要用iconv转成gb2312后再保存,如果用户的编码格式是“gb2312",那么传过来后我就不需要再用iconv来转了,所以我就要判断用户传过来的变量到底是什么编码格式,再决定是否用iconv

#5


你统一用UTF8来处理就行吧,兼容gb2312的,并且你也不用专门去识别,Apache已经帮你转换了啊

#6


我用IIS,请 diekiss(峯) 说的具体一点

#7


没人回答了吗?

#8


需要把上一页传过来的变量保存!

你上一页编码用的是什么,传过来的变量就是什么编码!

#9


用户可以改变浏览器的字符编码呢~~

#10


顶一下

#11


这样判断:
在除去半角字符后的串中,
1、全部字节都大于0xa0,可视为gb2312编码的
2、所有奇数字节大于等于0x81、偶数字节大于等于0x40可视为gbk编码
3、当串中各字节按如下规律排列时可视为utf-8编码
一个>=0xc2的字节和若干个0x80-0xbf的字节为一组

以上是从编码规则上进行判断的,当相关编码转换的函数可用的时候可以通过辗转变换来判断
思路是,当一个gb2312的字符经gb2312-utf-8转换到utf-8编码后是可以经utf-8-gb2312转换回来的
而一个utf-8字符做同样的操作就不能回到原来的样子了

#12


晕,有这么复杂嘛?

#13


linux 下需要安装iconv模块的,php安装时同时编译上.

#14


今天我碰到同样的问题,写了下面这个函数来解决,确实是简单了点,有些不负责任的感觉,但是效果达到了,也就先这么着呗,哈哈哈哈....

function getSafeCode($value)
{
$value_1= $value;
$value_2 = @iconv("utf-8","gb2312",$value_1);
$value_3 = @iconv("gb2312","utf-8",$value_2);

if (strlen($value_1) == strlen($value_3))
{
return $value_2;
}else
{
return $value_1;
}
}

#15


等了这么长时间,终于有人可以回答了! 结帖