2013-11-22 100 views
0

我试图改变字符latin1和UTF8从拉丁字符集转换为Unicode

习题集:的密码不工作的法国字符。密码适用于特殊字符(如引号,括号,美元符号等)。如果我转换的字符代码中的部分设置回latin1的,我可以登录使用法语字符,但不能使用UTF8

我有什么迄今所做的:

  • 改变了字符集数据库;我可以看到所有列类型 都显示为utf8。我在数据库和 表级别运行了查询。
  • 将代码部分的字符集更改为utf8。
  • 我的测试显示所有的都很酷,我可以看到重音的法文字符 没问题,而且看起来没有什么问题。这只是密码, 给我的问题。

请建议:

  • 我需要改变数据本身UTF8呢?
  • 我运行alter table命令,它将列字符集更改为 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可能会照顾法国人的角色呢?

+0

它可以为你的哈希函数从LATIN1和UTF-8字符集的生成不同的哈希?所以你应该重新哈希所有的密码。如果这甚至是可能的。 –

+0

更新代码和数据库字符集? – Anthony

+0

如果您当前的哈希是密码的Latin-1(可能实际上是Windows代码页1252)表示形式,那么是的,您必须在匹配之前将其转换为Latin-1,并且这意味着您永远无法拥有密码与一个非拉丁-1字符英寸在这种情况下,您应该检测尝试使用一个密码设置时,并给出一个合适的错误消息,而不是一个不可用的帐户。如果这种方法是不可接受的,你将不得不做一个密码迁移过程(无论如何,这可能是一个好主意,所以你可以移动到bcrypt等) – bobince

回答

-1

如果你需要焦炭从一些Unicode字符转换成另一种 您可以使用此功能

iconv()