2017-10-20 8 views
7

내 끝에서 파일을 UTF-8로 변환 할 수 있습니까?PHP에서 파일을 UTF-8로 변환하는 방법?

나는 함께 제출 후 파일에 액세스 할 수있는 경우

$_FILES['file']['tmp_name'] 

참고 : 캐릭터의 어떤 종류의 CSV 파일을 업로드 할 수 있습니다 사용자는, 나는 보통 알 수없는 8 비트가 발생 charset.

나는

$row = array(); 
$datas = file($_FILES['file']['tmp_name']); 
foreach($datas as $data) { 
    $data = mb_convert_encoding($data, 'UTF-8'); 
    $row[] = explode(',', $data); 
} 

을 시도하지만 문제는이 코드를 작은 따옴표와 같은 특수 문자를 제거합니다.

내 첫 번째 질문은 제가 추가 정보를 넣어 htmlspecialchars remove the value inside the array?

입니다. 도움을 줄 수있는 사람들에게 감사드립니다!

+0

어떤 샘플 파일을 사용해 볼 수 있습니까? –

+4

답변을 찾으실 수 있습니다 : https://stackoverflow.com/a/7980354/1348344 –

+0

그래서 가장 좋은 해결책은 utf-8이 포함되어 있는지 검색하는 것입니다. –

답변

2

시험해보세요.
내가 사용한 예는 테스트 환경에서 수행 한 작업 이었지만 코드를 약간 변경해야 할 수도 있습니다.

function neatify_files(&$files) { 
    $tmp = array(); 
    for ($i = 0; $i < count($_FILES); $i++) { 
     for ($j = 0; $j < count($_FILES[array_keys($_FILES)[$i]]["name"]); $j++) { 
      $tmp[array_keys($_FILES)[$i]][$j]["name"] = $_FILES[array_keys($_FILES)[$i]]["name"][$j]; 
      $tmp[array_keys($_FILES)[$i]][$j]["type"] = $_FILES[array_keys($_FILES)[$i]]["type"][$j]; 
      $tmp[array_keys($_FILES)[$i]][$j]["tmp_name"] = $_FILES[array_keys($_FILES)[$i]]["tmp_name"][$j]; 
      $tmp[array_keys($_FILES)[$i]][$j]["error"] = $_FILES[array_keys($_FILES)[$i]]["error"][$j]; 
      $tmp[array_keys($_FILES)[$i]][$j]["size"] = $_FILES[array_keys($_FILES)[$i]]["size"][$j]; 
     } 
    } 
    return $files = $tmp; 
} 

if (isset($_POST["submit"])) { 
    neatify_files($_FILES); 
    $file = $_FILES["file"][0]; 

    $handle = fopen($file["tmp_name"], "r"); 
    while ($line = fgets($handle)) { 
     $enc = mb_detect_encoding($line, "UTF-8", true); 
     if (strtolower($enc) != "utf-8") { 
      echo "<p>" . (iconv($enc, "UTF-8", $line)) . "</p>"; 
     } else { 
      echo "<p>$line</p>"; 
     } 
    } 
} 
?> 
<form action="<?= $_SERVER["PHP_SELF"]; ?>" method="POST" enctype="multipart/form-data"> 
    <input type="file" name="file[]" /> 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

이 기능 neatify_files은 다음과 같습니다

test 
café 
áÁÁÁááá 
žžœš¥± 
ÆÆÖÖÖasØØ 
ß 

가 그럼 난에 파일 입력했다 다음 코드를 수행 양식을했다 :

난에서 다음 데이터를 텍스트 파일을했다 레이아웃에서 논리적 인 배열을 만들기 위해 쓴 글입니다.

이 양식은 서버에 데이터를 POST로 보내는 표준 양식입니다.
참고 : $_SERVER["PHP_SELF"]을 사용하면 보안 위험, see here for more이 발생합니다.

데이터가 게시되면 파일을 변수에 저장합니다. 분명히 multiple 속성을 사용하면 코드가 이와 같이 보이지 않게됩니다.

$handle은 텍스트 파일의 전체 내용을 읽기 전용 형식으로 저장합니다. 따라서 "r" 인수

$encmb_detect_encoding 기능을 사용하여 인코딩 (duh)을 감지합니다.
처음 엔 올바른 인코딩을 얻는 데 어려움을 겪고있었습니다. encoding_list을 UTF-8 만 사용하고 strict을 true로 설정하십시오.

인코딩이 UTF-8이면 iconv 기능을 사용하여 UTF-8로 변환하지 않으면 간단하게 줄을 인쇄합니다.

1

당신은 단순히 PHP 방법 mb_convert_encoding에 텍스트를 변경 바이너리로 데이터를 변환 한 후 다음

FUNCTION bin2text($bin_str) 
{ 
    $text_str = ''; 
    $chars = EXPLODE("\n", CHUNK_SPLIT(STR_REPLACE("\n", '', $bin_str), 8)); 
    $_I = COUNT($chars); 
    FOR($i = 0; $i < $_I; $text_str .= CHR(BINDEC($chars[$i])), $i ); 
    RETURN $text_str; 
} 

FUNCTION text2bin($txt_str) 
{ 
    $len = STRLEN($txt_str); 
    $bin = ''; 
    FOR($i = 0; $i < $len; $i ) 
    { 
     $bin .= STRLEN(DECBIN(ORD($txt_str[$i]))) < 8 ? STR_PAD(DECBIN(ORD($txt_str[$i])), 8, 0, STR_PAD_LEFT) : DECBIN(ORD($txt_str[$i])); 
    } 
    RETURN $bin; 
} 

를 사용하여 바이너리 데이터로 파일 텍스트로 변환 할 수 있습니다 ($ FILETEXT, "UTF-8") ;

+1

왜 PHP 키워드를 대문자로 사용합니까? – zessx

+0

문제는 아니지만 다소 이상합니다. 편집자의 자동 완성 및 스 니펫을 사용하지 않는다는 의미입니까? – zessx

2

utf-8로 변환하기 전에 어떤 문자 집합인지 알아야합니다. 만약 당신이 그것을 알아낼 수 없다면, 당신은 정상적인 방법으로 그것을 utf8로 변환 할 수 없다. 그러나 인코딩을 결정할 수 없다면 utf-8로 변환하는 미친 방법은 이다. utf-8에서 유효하지 않은 바이트가 있다면 을 사용하여 대체 메시지로 사용할 수 있습니다 ...

경고, 테스트되지 않은 코드 (갑자기 급한)가 보일 수 있습니다. 이 :

foreach ($datas as $data) { 
    $encoding = guess_encoding ($data); 
    if (empty ($encoding)) { 
     // encoding cannot be determined... 
     // as a fallback, we simply strip any bytes that isnt valid utf-8... 
     // obviously this isn't a reliable conversion scheme. 
     // also this could probably be improved 
     $data = iconv ("ASCII", "UTF-8//TRANSLIT//IGNORE", $text); 
    } else { 
     $data = mb_convert_encoding ($data, 'UTF-8', $encoding); 
    } 
    $row [] = explode (',', $data); 
} 
function guess_encoding(string $str): string { 
    $blacklist = array (
      'pass', 
      'auto', 
      'wchar', 
      'byte2be', 
      'byte2le', 
      'byte4be', 
      'byte4le', 
      'BASE64', 
      'UUENCODE', 
      'HTML-ENTITIES', 
      '7bit', 
      '8bit' 
    ); 
    $encodings = array_flip (mb_list_encodings()); 
    foreach ($blacklist as $tmp) { 
     unset ($encodings [$tmp]); 
    } 
    $encodings = array_keys ($encodings); 
    $detected = mb_detect_encoding ($str, $encodings, true); 
    return (string) $detected; 
} 
1

의이를 해보자 :

function encode_utf8($data) 
{ 
    if ($data === null || $data === '') { 
     return $data; 
    } 
    if (!mb_check_encoding($data, 'UTF-8')) { 
     return mb_convert_encoding($data, 'UTF-8'); 
    } else { 
     return $data; 
    } 
} 

사용법 :

$content = file_get_contents($_FILES['file']['tmp_name']); 
$content = encode_utf8($content); 

$rows = explode("\n", $content); 
foreach ($rows as $row) { 
    print_r($row); 
}