在php中使用UTF-8字符集

在php中使用UTF-8字符集,php,utf-8,character-encoding,Php,Utf 8,Character Encoding,我已经和UTF-8字符集斗争了很长一段时间了,我仍然对一些事情感到困惑 我有一个网页,允许客户端在服务器上创建HTML文件和目录。目录名可以是任何语言。Adiós、días、chapter、level等。创建的目录稍后用作创建的HTML文件的URL。假设用户创建了一个目录Adiós,然后创建了一个名为welcome.html的文件。要查看此文件,客户机单击一个链接,然后获取目录和文件名,以创建路径Adiós/welcome.html。现在我对这些事情感到困惑 在php中创建目录时,我是否应该ur

我已经和UTF-8字符集斗争了很长一段时间了,我仍然对一些事情感到困惑

我有一个网页,允许客户端在服务器上创建HTML文件和目录。目录名可以是任何语言。Adiós、días、chapter、level等。创建的目录稍后用作创建的HTML文件的URL。假设用户创建了一个目录
Adiós
,然后创建了一个名为
welcome.html
的文件。要查看此文件,客户机单击一个链接,然后获取目录和文件名,以创建路径
Adiós/welcome.html
。现在我对这些事情感到困惑

  • 在php中创建目录时,我是否应该
    urlencode()
    每个文件和目录名

  • 如果我使用
    urlencode
    目录名,浏览器能否打开我的HTML页面?而不是
    href=“Adiós/welcome.html”
    它将是
    href=“Adi%C3%B3s/welcome.html”

  • 有时我的网页上会出现一张图片,我会将其命名为“Adi%C3%B3s/ing.jpg”;这样行吗

  • 地址栏中的url是否应显示非ASCII字符

  • 实际上,我
    urlencode()
    d遇到了第2点和第3点所述的问题,所以我想知道在使用英语以外的语言时,目录命名的正确方法是什么

    我有一个网页,允许客户端在服务器上创建html文件和文件夹

    那是错误的想法。
    将它们的文件存储在数据库中,并模拟目录结构

    编辑 由于评论中的这些愚蠢指控,我必须澄清:

    我所说的正是具有奇特名称的HTML文件,而不是一般的二进制文件。
    满意吗?

    如果您在文件系统中保存名称urlcoded,那么如果您想直接访问链接和图像源,就必须对它们进行双重urlcode,而不必使用PHP。或者,您可以在不使用任何URL编码的情况下保存名称,在这种情况下,链接将需要一次传递。但是,最后一个选项在Windows上不可用,因为文件系统函数中不支持Unicode

    或者,如果您仍然想绕过PHP,可以使用重写规则在名称被Apache解码后重新编码

    最后,您应该注意到您的方法是危险的——如果没有安全隐患,很难正确使用。您应该考虑有一个PHP文件为您的页面服务,并将其保存在数据库中。通过使用PATH_INFO变量,您仍然可以保留漂亮的文件名。如果此解决方案存在性能问题,还可以在PHP前面添加缓存层

  • 这取决于底层操作系统(IMHO Linux能够处理UTF-8文件名,而Windows不能)
  • 通常浏览器只需请求并打开像
    /tülüvkrü.htm
    这样的文件,我不知道IE是如何处理这些事情的
  • [与第二条相同]
  • 当然,如果文件名确实包含它们;如第2条所述。和3.,这取决于所使用的浏览器
    示例:http://tülüvkrü.de/中华人民共和国.htm(应该显示“It works!”)

    只有两个人可以创建文件夹…而不是普通公众!!。。。还是错了吗?是的。世界上没有一个网站管理员有为存储用户提供的页面创建物理文件夹的想法。许多主机提供商都允许通过客户后端来创建物理文件夹。-1-将文件存储在数据库中是错误的做法,您所做的只是用大量二进制对象填充数据库引擎宝贵的缓存,这是非常浪费的。对实际文件使用文件系统,但使用数据库存储元数据和指向文件实际存储位置的指针(可以抽象出来,不一定是用户文件夹的实际层次结构)。事实上,这些文件可以存储在一个单独的无cookieless域中,就像堆栈溢出一样。@Kev它们不是二进制的,伙计。它是HTML。你有没有想过让你的用户只使用英文字符而不使用urlencode()?这只是意味着文件夹和文件将更易于阅读和访问a…这要求文件夹名称可以是任何语言这与语言无关,当然与它是英语还是非英语无关!所有这些都与ASCII和非ASCII有关。不要将英语与ASCII混为一谈:这是一个错误。英语使用非ASCII,许多非英语语言使用ASCII。说出你的意思,该死。@安德鲁·摩尔:Unicode不是一个序列化方案。因此,不可能“以Unicode”存储内容。这是文档中的一个错误。这到底意味着什么?@tchrist:这意味着文件名存储在MFT中时是以UTF-8编码的。就这么简单。Windows XP及更高版本中的文件系统完全采用UTF-8。在Windows中开发的软件一定要调用每个API函数的宽字符版本(例如,
    GetLongPathNameW
    GetLongPathNameA
    相比)。@Andrew无关,因为PHP使用的是Win32 API的ANSI版本,因此,只能打开由活动代码页中可用字符组成的文件。@Andrew这些文件不是“不明确”的版本。这些宏可以根据您是否定义了UNICODE(PHP没有定义),扩展到任意一个版本。事实上,PHP无法在Windows上打开任意路径(试试——使用代码页不支持的脚本创建文件名,然后用PHP打开)。不,你不能把UTF16数据(中间的0字节)传递给PHP的文件函数,Windows API不“自动检测”所通过的编码(这是不可能的BTW),并相应地调整代码路径…