0

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

在我的 mysql 表中,一切似乎都很好,“ö”显示为“ö”,当我使用确切的文件名编写搜索查询时,我可以找到该文件: 在此处输入图像描述

但是我的 php 代码失败了,做同样的查询。当我通过文件系统获取文件名时readdir,结果查询似乎很奇怪: 在此处输入图像描述

如您所见,“ö”不再是真正的“ö”了。它稍大一些,但没有大的“Ö”那么大。即使光标很有趣,我也可以停在字符中间,当我点击然后Backspace删除字符时,它首先删除它上面的点,然后第二次删除剩余的“o”..

当我使用例如转换文件名时,rawurlencode我得到了这个: 在此处输入图像描述

您可以在 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">
4

1 回答 1

4

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

但是,如果您确实需要处理损坏的东西,您需要的是 Unicode 规范化,它由规范化器类在 PHP 中提供。NFKC 应该给你你期望的形式。

于 2013-06-30T17:29:57.227 回答