从拉丁字符集转换为unicode


converting from latin character set to unicode

我正在尝试将字符集从latin1更改为utf8

问题:法语字符的密码无效。密码适用于特殊字符(如引号、括号、美元符号等)。如果我将代码部分中的字符集转换回latin1,我可以使用法语字符登录,但不能使用utf8

到目前为止我做了什么:

  • 更改了数据库的字符集;我可以看到所有列类型显示为utf8。我在数据库和表级别
  • 将代码部分的字符集更改为utf8
  • 我的测试显示一切都很酷,我能看到带口音的法语字符很好,似乎没有什么坏的。只有密码正在给我带来问题

请建议:

  • 我是否也需要将数据本身更改为utf8
  • 我运行了altertable命令,它将列字符集更改为utf8,我是不是遗漏了什么

我怀疑这可能是原因,因为如果我将代码部分转换为latin1,密码会正常工作。因此,我认为代码和数据库是latin1,因此它可以识别特殊字符,但当我将其更改为utf8时,它无法解释特殊的法语字母,因为这些字母最初存储为latin1。

PHP和MySQL都是最新版本。

由于我的回复很长,我决定在这里添加它:

哈希函数非常复杂,它使用了md5、encode64和crypt函数的组合。我注意到拉丁文和unicode的结果pwd不同。这就是为什么,我怀疑之前使用latin1生成的pwd可以匹配pwd,而不是转换后的unicode。同样,这种情况只发生在法语字母上,而不是0到127的ascii范围。我不知道如何处理现有用户可以成功登录的情况,将字符集更改为unicode-8。我不能使用iconv(),因为我无法区分密码是使用latin1还是unicode8创建的。除了更改数据库之外,我还需要更改数据吗?如何更改?如果我的想法是正确的,那么数据转换到unicode8可能也会处理法语字符?

如果需要将字符从某种Unicode转换为另一种Unicode你可以使用这个功能

iconv()