我很困惑!最近,我的webhotel更新了php,现在我的旧表以不同的方式(错误地)呈现特殊字符。我的表和我的输入/输出php页面都被设置为utf-8,由于这次更新,php的输入也被区别对待;现在,我的特殊字符在进入数据库时被utf-8编码。因此,由于这一变化,当我在phpMyAdmin中查看表时,旧的插入具有原始的(未编码的)特殊字符——新的帖子具有utf-8编码的字符(也是特殊的)。
因此,我想做的是重写输入和输出,以插入和显示未编码的字符,但如果不完全跳过utf-8(在php和mySQL中),我不确定这是否可行。但是有一种utf-8提交非编码字符的方法吗
而且——也许更根本的是——我需要了解可能的负面影响是什么。我在里面和外面使用丹麦语字符,我不会使用任何其他语言(对于这个项目)。那么,如果可以使用utf-8-插入和输出未编码的字符,那么我会遇到意外/破坏性的问题吗
我读了很多关于php/mySQL/特殊字符的帖子,但我还没有看到这个问题的角度。希望我没有重复我希望不会,因为在更新之前它一直运行得很好。
即使您只使用丹麦语字符,也可以一直使用utf8。
有许多地方需要说明编码:
- html顶部的
- 数据库中的列(CHARACTER SET列默认来自表,默认来自数据库)
- PHP代码中的编码
当你CREATE TABLE
时,钉上DEFAULT CHARACTER SET utf8
。如果你有现有的桌子,如果没有,就大声说出来;我们可能需要对付他们。如果您想要丹麦语排序规则,也可以指定COLLATION utf8_danish_ci
。然后(如果我没有记错的话),aa
将在z
之后排序。(默认值为utf8_general_ci
,它不会进行排序。)弄清楚php代码中有(或可以得到)什么编码。如果你有一些带有重音的文本,请这样做:
$hex = unpack('H*', $text);
echo implode('', $hex)
如果你有utf8,å将是C3A5
,对于latin1,则是E5
。
无论表中的编码是什么,都必须调用set_charset('utf8')或set_charset('latin1'),这取决于PHP中数据中的编码。MySQL很乐意在latin1和utf8之间进行代码转换,因为事情在PHP和MySQL之间传递。对于不同的API:
⚈ mysql: mysql_set_charset('utf8');
⚈ mysqli: $mysqli_obj->set_charset('utf8');
⚈ PDO: $db = new PDO('dblib:host=host;dbname=db;charset=UTF-8', $user, $pwd);
有关更多信息,请参阅http://mysql.rjweb.org/doc.php/charcoll。