从mysql cp1251_general_ci collat​​ion(Windows-1251)转换为UTF-8 php

时间:2015-07-21 09:01:49

标签: php mysql encoding utf-8 windows-1251

我在cp1251_general_ci排序规则中有一个mysql varchar(50)行。 在php中的mysql_fetch_row之后我得到了一个$ string。 然后我做以下事情:

echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // echoes Windows-1251
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251');
echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // again echoes Windows-1251

为什么第二次字符串不是UTF-8?

我也试过

$string = iconv('Windows-1251', 'UTF-8', $string);

但是,out charset再次出现在Windows-1251上。

在最后的结果中,我的文件名中包含了$ string变量。

如何将mysql cp1251_general_ci归类(Windows-1251)转换为UTF-8?

P.S。

echo $string; \\ echoes ������
echo bin2hex($string); \\ echoes cce5e3e0f4eeed
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251');
echo $string; \\ echoes Мегафон
echo bin2hex($string); \\ echoes  d09cd0b5d0b3d0b0d184d0bed0bd

但是

fopen("../tmp/$string.log", "w");

创建一个文件... / tmp / ?????????????。log(在linux中)

1 个答案:

答案 0 :(得分:0)

找到了这种奇怪情况的原因!

简而言之:如果您在服务器(在终端中)以不可读的符号看到正确编码的UTF-8字符串 - 请检查服务器区域设置。 如果您看到mb_detect_encoding()方法的奇怪行为,请不要忘记 - mb_detect_encoding不会为您提供字符串的精确编码确定。

文件名中编码不正确的原因:... / tmp / ?????????????。日志文件是服务器上的语言环境!以下是文件所在服务器上的语言环境命令结果:

$ locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

为了在服务器上正确显示文件名中的UFT-8符号,服务器区域设置也必须是utf-8。

关于问题中的所有转换。两种方法:

iconv('Windows-1251', 'UTF-8', $string);

mb_convert_encoding($string, 'UTF-8', 'Windows-1251');

在这种情况下工作正常。

唯一的问题是为什么

的第二个回声
echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // echoes Windows-1251
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251');
echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // again echoes Windows-1251

不是UTF-8?

答案是 - mb_detect_encoding没有给你一个字符串的精确编码确定