我在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中)
答案 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没有给你一个字符串的精确编码确定