在php中使用UTF-8字符集

时间:2011-09-07 15:39:48

标签: php utf-8 character-encoding

我一直在努力使用UTF-8字符集已经有一段时间了,而且我仍然对某些事情感到困惑。

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

  1. 在php中创建目录时,我应该urlencode()每个文件和目录名吗?

  2. 如果我urlencode目录名称,浏览器是否可以打开我的HTML页面?而不是href="Adiós/welcome.html",它将是href="Adi%C3%B3s/welcome.html"

  3. 我的网页上有时会出现一张图像,我将其作为"Adi%C3%B3s/ing.jpg";这会起作用吗?

  4. 地址栏中的网址是否应显示非ASCII字符?

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  

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

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

EDIT 因为评论中的这些愚蠢的指责我必须澄清:

我说的是HTML文件的这种情况,特别是花哨的名字,而不是一般的二进制文件。

满意吗?