从 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 不会为您提供字符串的精确编码确定
我在 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');
在这种情况下工作正常。
唯一的问题是为什么
的第二个echoecho 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 不会为您提供字符串的精确编码确定