1

我在 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?

附言

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 中)

4

1 回答 1

0

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

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

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

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

于 2015-07-22T12:56:33.790 回答