php文件名编码,ö不是真正的ö或什么是“ö”?

时间:2013-06-30 17:21:30

标签: php mysql utf-8 readdir

我在我的php服务器上将图像上传到一个小cms,现在我有一个名为“1372609671-TerrassenbödenWatrawood.jpg”的文件,这会导致一些严重的问题。我已将所有内容下载到我的Mac并调试了所有内容......面对:

在我的mysql表中,一切似乎都很好,“ö”显示为“ö”,当我用确切的文件名编写搜索查询时,我可以找到该文件: enter image description here

但我的php代码失败,执行相同的查询。当我通过文件系统获取文件名时,使用readdir,结果查询似乎很奇怪: enter image description here

你可以注意到,“ö”不再是真正的“ö”了......它稍微大一点,但没有大“Ö”那么大..即使光标很有趣,我可以停在中间该字符,当我点击 Backspace 删除字符时,它首先删除它上面的点,并在第二次删除剩余的“o”..

当我使用例如转换文件名时rawurlencode我得到了这个: enter image description here

你可以在utf-8的东西开始之前看到一个“o”然后一个%CC给出点和%88给出一种空间......这到底是什么意思?我怎么能把它变成一个简单的utf-8“ö”,因为使用这个东西进行搜索查询将是无用的..: - /

有关详细信息,请参阅数据库架构:

CREATE SCHEMA IF NOT EXISTS `cms` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;

DROP TABLE IF EXISTS `upload`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `upload` (
  `id` int(11) NOT NULL auto_increment,
  `file_name` varchar(255) NOT NULL,
  `file_type` varchar(20) NOT NULL,
  `file_path` varchar(255) NOT NULL,
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `session_id` varchar(45) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8965 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

我的cms上的所有内容都是utf-8:

<meta charset="utf-8">

1 个答案:

答案 0 :(得分:4)

你在这里有什么不对。这是一个o,然后是U + 0308 COMBINING DIAERESIS,这是生产ö的正确方法。它被称为“分解形式”,而带有DIAERESIS的U + 00F6 LATIN SMALL LETTER O是一种“组合形式”。分解形式更通用,而不是每个字符都有一个组合形式(它们主要是为了向后兼容而存在)。关于分解的表单没有任何“真实”的东西,如果它在编辑器中显示错误,那只是因为你的编辑器支持很差的Unicode。在搜索时,任何正常工作的搜索引擎都应该将U+006F U+0308U+00F6完全相同。

但是,如果你确实需要使用破碎的东西,你想要的是Unicode标准化,由normalizer类在PHP中提供。 NFKC应该为您提供您期望的表格。