복붙노트

UTF-8 문자열을 사용하여 PHP에서 파일 시스템 함수를 사용하려면 어떻게해야합니까?

PHP

UTF-8 문자열을 사용하여 PHP에서 파일 시스템 함수를 사용하려면 어떻게해야합니까?

mkdir을 사용하여 UTF-8 문자로 폴더를 만들 수 없습니다.

<?php
$dir_name = "Depósito";
mkdir($dir_name);
?>

Windows 탐색기에서이 폴더를 탐색 할 때 폴더 이름은 다음과 같습니다.

Depósito

어떻게해야합니까?

나는 php5를 사용하고있다.

해결법

  1. ==============================

    1.원하는 문자열을 파일 이름으로 urlencode하십시오. urlencode에서 반환 된 모든 문자는 파일 이름 (NTFS / HFS / UNIX)에서 유효합니다. 그런 다음 파일 이름을 UTF-8 (또는 그 안에있는 인코딩)으로 다시 urldecode 할 수 있습니다.

    원하는 문자열을 파일 이름으로 urlencode하십시오. urlencode에서 반환 된 모든 문자는 파일 이름 (NTFS / HFS / UNIX)에서 유효합니다. 그런 다음 파일 이름을 UTF-8 (또는 그 안에있는 인코딩)으로 다시 urldecode 할 수 있습니다.

    주의 사항 (아래의 솔루션에도 모두 해당) :

    다음은 덜 매력적인 솔루션이며, 더 복잡하고 더 많은주의 사항이 있습니다.

    Windows에서 PHP 파일 시스템 래퍼는 파일 / 디렉토리 이름에 ISO-8859-1 문자열을 반환합니다. 그러면 두 가지 선택 사항이 제공됩니다.

    풍성한 경고!

    이 악몽은 파일 이름을 만들기 위해 음역해야하는 이유입니다.

  2. ==============================

    2.Unix와 Linux (OS X에서도 가능)에서 현재 파일 시스템 인코딩은 LC_CTYPE 로케일 매개 변수 (function setlocale () 참조)에 의해 제공됩니다. 예를 들어 인코딩이 UTF-8임을 의미하는 en_US.UTF-8과 같은 것으로 평가 될 수 있습니다. 그런 다음 파일 이름과 경로를 fopen ()을 사용하여 만들거나이 인코딩을 사용하여 dir ()으로 검색 할 수 있습니다.

    Unix와 Linux (OS X에서도 가능)에서 현재 파일 시스템 인코딩은 LC_CTYPE 로케일 매개 변수 (function setlocale () 참조)에 의해 제공됩니다. 예를 들어 인코딩이 UTF-8임을 의미하는 en_US.UTF-8과 같은 것으로 평가 될 수 있습니다. 그런 다음 파일 이름과 경로를 fopen ()을 사용하여 만들거나이 인코딩을 사용하여 dir ()으로 검색 할 수 있습니다.

    Windows에서 PHP는 "비 유니 코드 인식 프로그램"으로 작동하고 파일 시스템에서 사용되는 UTF-16 (Windows 2000 이상)에서 선택한 "코드 페이지"로 파일 이름이 앞뒤로 변환됩니다. "국가 별 및 언어 옵션"제어판, "형식"탭 패널은 LC_CTYPE 옵션으로 검색 한 코드 페이지를 설정하는 반면 "비 유니 코드 프로그램 용 관리 -> 언어"는 파일 이름에 대한 변환 코드 페이지를 설정합니다. 서부 국가에서 LC_CTYPE 매개 변수는 language_country.1252와 같은 것으로 평가됩니다. 여기서 1252는 ISO-8859-1과 유사하지만 완전히 동일하지 않은 "Windows-1252 인코딩"이라고도하는 코드 페이지입니다. 일본에서는 일반적으로 932 코드 페이지가 설정되며, 다른 국가의 경우에도 마찬가지입니다. PHP에서는 현재 코드 페이지로 이름을 표현할 수있는 파일을 만들 수 있습니다. 파일 시스템에서 검색 한 파일 이름과 경로는 "가장 적합한"현재 코드 페이지를 사용하여 UTF-16에서 바이트로 변환됩니다.

    이 매핑은 근사치이므로 일부 문자가 예측할 수없는 방식으로 변환 될 수 있습니다. 예를 들어 Caffé Brillì.txt는 현재 코드 페이지가 1252 인 경우 PHP 문자열 Caff \ xE9 Brill \ xEC.txt로 dir ()에 의해 반환되지만 일본 시스템에서 Caffe Brilli.txt를 반환합니다 악센트 부호가있는 모음이 932 코드 페이지에서 누락 된 다음 악센트가없는 "모음"으로 대체 되었기 때문입니다. 전혀 번역 할 수없는 문자는? (물음표). 일반적으로 Windows에서는 그러한 유물을 감지하는 안전한 방법이 없습니다.

    자세한 내용은 PHP 버그 번호에 대한 제 응답에서 확인할 수 있습니다. 47096.

  3. ==============================

    3.문제는 Windows가 파일 시스템 문자열에 utf-16을 사용하는 반면 Linux 및 다른 사람들은 다른 문자 세트를 사용하지만 종종 utf-8을 사용한다는 것입니다. utf-8 문자열을 제공했지만 Windows에서 다른 8 비트 문자 집합 인코딩 (Latin-1)으로 해석 된 다음 utf-8에서 2 바이트로 인코딩 된 비 ASCII 문자는 다음과 같이 처리됩니다. Windows에서 2 문자 인 경우

    문제는 Windows가 파일 시스템 문자열에 utf-16을 사용하는 반면 Linux 및 다른 사람들은 다른 문자 세트를 사용하지만 종종 utf-8을 사용한다는 것입니다. utf-8 문자열을 제공했지만 Windows에서 다른 8 비트 문자 집합 인코딩 (Latin-1)으로 해석 된 다음 utf-8에서 2 바이트로 인코딩 된 비 ASCII 문자는 다음과 같이 처리됩니다. Windows에서 2 문자 인 경우

    일반적인 해결책은 소스 코드를 ascii로 100 % 유지하고 다른 곳에 문자열을 저장하는 것입니다.

  4. ==============================

    4.PHP 7.1은 Windows에서 OEM 코드 페이지를 무시하고 UTF-8 파일 이름을 지원합니다.

    PHP 7.1은 Windows에서 OEM 코드 페이지를 무시하고 UTF-8 파일 이름을 지원합니다.

  5. ==============================

    5.com_dotnet PHP 확장을 사용하면 Windows의 Scripting.FileSystemObject에 액세스 한 다음 UTF-8 파일 / 폴더 이름으로 원하는 모든 작업을 수행 할 수 있습니다.

    com_dotnet PHP 확장을 사용하면 Windows의 Scripting.FileSystemObject에 액세스 한 다음 UTF-8 파일 / 폴더 이름으로 원하는 모든 작업을 수행 할 수 있습니다.

    이 패키지를 PHP 스트림 래퍼로 패키징 했으므로 매우 사용하기 쉽습니다.

    https://github.com/nicolas-grekas/Patchwork-UTF8/blob/lab-windows-fs/class/Patchwork/Utf8/WinFsStreamWrapper.php

    먼저 php.ini에서 com_dotnet 확장 기능이 활성화되어 있는지 확인하십시오. 다음과 함께 래퍼를 활성화하십시오.

    stream_wrapper_register('win', 'Patchwork\Utf8\WinFsStreamWrapper');
    

    마지막으로, 익숙한 함수 (mkdir, fopen, rename 등)를 사용하지만 경로 앞에 word : //

    예 :

    <?php
    $dir_name = "Depósito";
    mkdir('win://' . $dir_name );
    ?>
    
  6. ==============================

    6.이 확장 프로그램을 사용하여 문제를 해결할 수 있습니다. https://github.com/kenjiuno/php-wfio

    이 확장 프로그램을 사용하여 문제를 해결할 수 있습니다. https://github.com/kenjiuno/php-wfio

    $file = fopen("wfio://多国語.txt", "rb"); // in UTF-8
    ....
    fclose($file);
    
  7. ==============================

    7.이 링크에서 CodeIgniter Text 도우미를 사용해보십시오. convert_accented_characters () 함수에 대해 읽어보십시오.

    이 링크에서 CodeIgniter Text 도우미를 사용해보십시오. convert_accented_characters () 함수에 대해 읽어보십시오.

  8. ==============================

    8.Windows 또는 Linux에서 PHP 및 호환 가능한 .htaccess 파일과 호환되는 UTF-8을 사용하는 파일 시스템을 사용하는 도구 세트 :

    Windows 또는 Linux에서 PHP 및 호환 가능한 .htaccess 파일과 호환되는 UTF-8을 사용하는 파일 시스템을 사용하는 도구 세트 :

    function define_cur_os(){
    
        //$cur_os=strtolower(php_uname());
    
        $cur_os=strtolower(PHP_OS);
    
        if(substr($cur_os, 0, 3) === 'win'){
    
            $cur_os='windows';
    
        }
    
        define('CUR_OS',$cur_os);
    
    }
    
    function filesystem_encode($file_name=''){
    
        $file_name=urldecode($file_name);
    
        if(CUR_OS=='windows'){
    
            $file_name=iconv("UTF-8", "ISO-8859-1//TRANSLIT", $file_name);
    
        }     
    
        return $file_name;
    
    }
    
    function custom_mkdir($dir_path='', $chmod=0755){
    
        $dir_path=filesystem_encode($dir_path);
    
        if(!is_dir($dir_path)){
    
            if(!mkdir($dir_path, $chmod, true)){
    
                //handle mkdir error
    
            }
        }
        return $dir_path;
    }
    
    function custom_fopen($dir_path='', $file_name='', $mode='w'){
    
        if($dir_path!='' && $file_name!=''){
    
            $dir_path=custom_mkdir($dir_path);
    
            $file_name=filesystem_encode($file_name);
    
            return fopen($dir_path.$file_name, $mode);
    
        }
    
        return false;
    
    }
    
    function custom_file_exists($file_path=''){
    
        $file_path=filesystem_encode($file_path);
    
        return file_exists($file_path);
    
    }
    
    function custom_file_get_contents($file_path=''){
    
        $file_path=filesystem_encode($file_path);
    
        return file_get_contents($file_path);
    
    }
    

    추가 리소스

  9. from https://stackoverflow.com/questions/1525830/how-do-i-use-filesystem-functions-in-php-using-utf-8-strings by cc-by-sa and MIT license