从 mysql cp1251_general_ci 排序规则 (Windows-1251) 转换为 UTF-8 php

Convert from mysql cp1251_general_ci collation (Windows-1251) into UTF-8 php

我在 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);

但是输出字符集又是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 中)

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

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

文件名编码不正确的原因:.../tmp/????????????.log文件是服务器上的语言环境!这是文件所在服务器上的locale命令结果:

$ 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
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 不会为您提供字符串的精确编码确定