UTF8 转换为 latin1_swedish_ci

6
有很多关于将latin1_swedisch_ci转换为utf8的话题。但是反过来怎么办呢?我已经遇到这个问题很长时间了,但迄今为止还没有找到解决方法。由于我不知道还有什么其他方式可以访问这个数据库,所以我不想改变表的字符编码。
我在表中有一个以latin1_swedisch_ci格式设置的列。现在我需要在php中编写查询语句。这个数据库包含德国和法国的名字,意味着我会遇到像ö、ä、ô等字符。我该怎么办呢?
例如,如果我想查询名字'Bürki',那么我需要写类似$name='Bürki'的语句。有没有一种正确的方法可以将其转换为latin1_swedisch_ci,而不是使用字符串替换特殊字符的方式来实现?

首先,你真的想将你的文本编码为Latin1吗?这意味着你只能存储Latin1编码中定义的256个可能字符。无法存储其他外来字符。而且,“Bürki”只是意味着你在某个地方存在编码不匹配的问题,很可能是你试图将UTF-8编码的数据存储在一个期望Latin1的数据库中。你应该解决这个不匹配问题。 - deceze
我运行了一个脚本,应该将latin1_swedish_ci列转换为UTF8。然而,所有包含特殊字符的变量,例如'Bürki',都被转换为'B'(或'Brühlmann'被转换为'Br')... - mkn
@mkn 当iconv(或mysql)遇到当前编码中无效的字符时,就会发生这种情况。 - Pekka
2个回答

4

iconv()函数可以将字符串从一种编码转换为另一种编码。

你需要关注的编码是utf-8iso-8859-1,后者相当于latin1

"swedish"、"german"等本地化只影响排序等问题,字符编码始终相同。

附:

然后我必须写类似 $name='Bürki' 的东西。

如果将源文件编码为UTF-8,则可以直接写Bürki。(然后您需要将该字符串转换为iso-8859-1


如果我执行 $name = iconv("UTF-8", "ISO-8859-1","Bär"); 那么 $name 的值会被设置为 'B',这是怎么回事呢... - mkn
@mkn,那你没有将源文件编码为UTF-8。请参考上面的内容。 - Pekka
@mkn 那不应该发生。你确定到了1000%吗? - Pekka
我在TextWrangler中打开了源代码文件,在底部它显示为UTF-8。另外我的Textmate编辑器保存所有文件都是使用UTF-8编码。 - mkn

1

我同意Pekka的观点,不过我会尝试使用utf8_decode()函数,因为可能没有安装iconv...

然而,Iconv更加强大 - 它可以进行转译。但是对于这个目的,我认为utf8_decode()已经足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接