同事使用iconv进行编码转换时使用的时utf8,而不是utf-8,我测试了下发现utf8和utf-8在iconv和mb_str中结果是一样的,如: iconv('utf8', 'gb2312', '测试'); 和 iconv('utf-8', 'gb2312', '测试');。但是google了下发现也有人因为使用utf8而不是utf-8遇到问题的情况 http://readyfighting.com/archives/156。
那么请问二者使用起来有什么不同吗?
回复内容: 同事使用iconv进行编码转换时使用的时utf8,而不是utf-8,我测试了下发现utf8和utf-8在iconv和mb_str中结果是一样的,如: iconv('utf8', 'gb2312', '测试'); 和 iconv('utf-8', 'gb2312', '测试');。但是google了下发现也有人因为使用utf8而不是utf-8遇到问题的情况 http://readyfighting.com/archives/156。
那么请问二者使用起来有什么不同吗?
根据 libiconv-1.14/lib/encodings.def , utf-8和utf8都会被识别成utf8编码,所以没有区别,所以所有使用libiconv的程序都没问题,比如php的iconv库。
/* general multi-byte encodings */defencoding(( utf-8, /* iana, rfc 2279 */ /*utf8, jdk 1.1 */ /*cp65001, windows */ ), utf8, { utf8_mbtowc, null }, { utf8_wctomb, null })#ifdef use_hpux_aliasesdefalias( utf8, /* hp-ux */ utf8)#endif
根据 ext/mbstring 的 mbfilter_utf8.c ,utf-8 (作为name/mimename) 和 utf8 (作为alias)也都可以被识别,所以也一样。
static const char *mbfl_encoding_utf8_aliases[] = {utf8, null};const mbfl_encoding mbfl_encoding_utf8 = { mbfl_no_encoding_utf8, utf-8, utf-8, (const char *(*)[])&mbfl_encoding_utf8_aliases, mblen_table_utf8, mbfl_enctype_mbcs};
顺便说一下,mysql不识别 utf-8,必须用utf8。
mysql> create table t1 (id int primary key, name int) character set utf-8;
error 1115 (42000): unknown character set: 'utf'
你好,我在windows环境下测试了一行代码
iconv('utf8', 'gb2312', '测试');
得到一个警告
notice: iconv(): wrong charset, conversion from `utf8' to `gb2312' is not allowed
这说明应该使用utf-8这种形式才是正确的。
mbstring.supported-encodings 提到的mbstring支持的编码中也只有utf-8这种形式。
或许是你可以尝试修改一下php.ini
error_reporting = e_all | e_strictdisplay_errors = on
也许就可以看到警告信息了。
根据felix021的提示,再测试两行代码
print_r(mb_list_encodings());print_r(mb_encoding_aliases('utf8'));
可知mb中的确是做为别名处理了。