挪威人物问题

时间:2010-01-01 22:08:06

标签: php

我按如下方式创建了一个文件夹。

function create(){
if ($this->input->post('name')){
    ...
            ...
    $folder = $this->input->post('name');
    $folder = strtolower($folder);
    $forbidden = array(" ", "å", "ø", "æ", "Å", "Ø", "Æ");
    $folder = str_replace($forbidden, "_", $folder);
    $folder = 'images/'.$folder;
    $this->_create_path($folder);
            ...

但是它不能用_(在条形图下)取代挪威字符

例如,Åtestøre将创建一个名为ã...test_ã¸re的文件夹。

我有

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

在标题中。

我在XAMPP / Windows Vista上使用PHP / codeigniter。

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

您必须记住以正确的编码保存PHP文件。尝试将其保存在ISO-8859-1或UTF8中。还记得在保存后重新打开它,这样你就可以看到它是否被正确保存或是否转换了字符。您的IDE可能会将它们转换为字节(奇怪的字符)而不在编辑器中显示更改。

  1. 当您写出文件时,另存为..
  2. filename.php及其下面应该说是编码。在这里你应该选择ISO-8859-1(或Latin-1)或UTF8。如果您使用记事本,这将不是一个选项,您需要获得a proper editor
  3. 将相同的编码应用于该应用程序中的所有其他PHP文件。我认为ISO-8859-1会做到这一点,但UTF8是一个很好的默认值,所以选择它是否适用于此。

答案 1 :(得分:1)

尝试显式设置PHP使用的内部编码:

mb_internal_encoding('UTF-8');

编辑:实际上,现在我想到了......我建议使用strtr。它支持多字节字符,速度更快:

$from  = ' åøæÅØÆ';
$to    = '_______';
$fixed = strtr($string, $from, $to);

答案 2 :(得分:1)

如果有的话,大多数普通的字符串函数都不能很好地处理Unicode字符。

在这种情况下,您可以使用正则表达式解决此问题。

<?php
$string = 'Åtest øre';
$regexp = '/( |å|ø|æ)/iu';
$replace_char = '_';

echo preg_replace($regexp, $replace_char, $string)
?>

返回:

_test__re

答案 3 :(得分:1)

从PHP到Windows文件系统的接口是C标准库。 Windows使用系统默认代码页将其Unicode文件系统命名方案映射到PHP的字节。如果您在挪威,可能您的系统默认代码页是1252西欧,但这是一个部署细节,当您将其置于实时服务器上时可能会发生变化,而且它不容易修复。

您的网页/网站编码为UTF-8。不幸的是,虽然现代Linux服务器通常使用UTF-8作为其文件系统访问编码,但Windows不能,因为默认代码页永远不是UTF-8。您可以使用iconv将UTF-8字符串转换为cp1252;当然,所有不适合此代码页的字符都将丢失或损坏。另一种方法是使整个站点使用charset=iso-8859-1,这可以(大多数情况下)存储在cp1252中。虽然使用非UTF-8字符集有点倒退,当然如果你使用不同的默认代码页将它部署到一台机器上它仍然会中断。

由于这个原因和其他原因,文件名很难。您应该尽一切可能避免使用任意字符串创建文件名。您需要阻止更多字符才能使字符串适合Windows上的文件名并避免目录遍历攻击。最好在文件系统上存储123.jpeg之类的ID,如果要使其显示在不同的字符串名称下,则使用脚本访问或URL重写。

如果您必须从任意字符串创建一个Windows友好的文件名,那么最简单的做一些类似于slug生成:preg_replace away 所有字符(Unicode或其他)不适合像[A-Za-z0-9_-]这样的已知安全的,检查结果是否为空并且与bad filenames之一不匹配(如果是这样,前置下划线)并最后添加扩展名

答案 4 :(得分:0)

使用此功能。

$string = $this->input->post('name');
$regexp = '/( |å|ø|æ|Å|Ø|Æ|Ã¥|ø|æ|Ã…|Ø|Æ)/iU';
$replace_char = '_';