2017-10-20 19 views
7

Có thể chuyển đổi tệp thành UTF-8 ở cuối của tôi không?Làm thế nào để chuyển đổi một tập tin sang UTF-8 trong php?

Nếu tôi có quyền truy cập vào các tập tin sau khi nộp hồ sơ với

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

Lưu ý: Người dùng có thể tải lên một tập tin CSV với bất kỳ loại charset, tôi thường gặp phải một chưa biết 8-bit bộ ký tự.

tôi cố gắng

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

Nhưng vấn đề là, mã này loại bỏ ký tự đặc biệt như dấu nháy đơn.

câu hỏi đầu tiên của tôi là htmlspecialchars remove the value inside the array?

Tôi đặt nó để biết thêm thông tin. Cảm ơn những người có thể giúp đỡ!

+0

Bất kỳ tệp mẫu nào có thể thử? –

+4

Bạn có thể tìm thấy câu trả lời của bạn ở đây: https://stackoverflow.com/a/7980354/1348344 –

+0

Vì vậy, giải pháp tốt nhất là chỉ để phát hiện nếu nó có chứa một utf-8? –

Trả lời

2

Hãy dùng thử.
Ví dụ tôi đã sử dụng là điều tôi đang làm trong môi trường thử nghiệm, bạn có thể cần phải thay đổi mã một chút.

Tôi đã có một tập tin văn bản với các dữ liệu sau trong:

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

Sau đó, tôi đã có một hình thức mà mất một đầu vào tập tin trong và thực hiện đoạn mã sau:

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> 

Chức năng neatify_files là một cái gì đó tôi đã viết để làm cho các mảng $_FILES hợp lý hơn trong cách bố trí của nó.

Biểu mẫu là biểu mẫu chuẩn chỉ đơn giản là POST s dữ liệu đến máy chủ.
Lưu ý: Sử dụng $_SERVER["PHP_SELF"] là rủi ro bảo mật, see here for more.

Khi dữ liệu được đăng, tôi lưu trữ tệp trong một biến. Rõ ràng, nếu bạn đang sử dụng thuộc tính multiple, mã của bạn sẽ không giống như thế này.

$handle lưu toàn bộ nội dung của tệp văn bản ở định dạng chỉ đọc; do đó, đối số "r".

$enc sử dụng chức năng mb_detect_encoding để phát hiện mã hóa (duh).
Lúc đầu, tôi gặp sự cố khi lấy mã hóa chính xác. Đặt encoding_list để chỉ sử dụng UTF-8 và đặt strict là đúng.

Nếu mã hóa là UTF-8 thì tôi chỉ cần in dòng, nếu tôi không chuyển đổi nó sang UTF-8 bằng chức năng iconv.

1

bạn có thể chuyển đổi các tập tin văn bản vào dữ liệu nhị phân bằng công

sau
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; 
} 

sau khi chuyển đổi dữ liệu vào nhị phân bạn chỉ cần thay đổi văn bản sang phương pháp php mb_convert_encoding ($ fileText, "UTF-8") ;

+1

Tại sao các bạn uppercasing từ khóa PHP? – zessx

+0

Không phải là vấn đề, nhưng điều này thật kỳ lạ. Điều này có nghĩa là bạn không bao giờ sử dụng tính năng tự động hoàn thành và đoạn trích của biên tập viên? – zessx

2

trước khi bạn có thể chuyển nó sang utf-8, bạn cần phải biết những gì characterset nó được. nếu bạn không thể tìm ra rằng, bạn không thể trong bất kỳ cách lành mạnh chuyển nó sang utf8 .. Tuy nhiên, một cách điên cuồng để chuyển nó sang utf8, nếu mã hóa không thể được xác định, là chỉ cần dải bất kỳ byte nào không có giá trị trong utf-8, bạn có thể sử dụng nó làm dự phòng ...

cảnh báo, mã chưa được kiểm tra (im đột nhiên), nhưng có thể trông giống như này:

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

Hãy thử điều này:

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; 
    } 
} 

Cách sử dụng:

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

$rows = explode("\n", $content); 
foreach ($rows as $row) { 
    print_r($row); 
} 
Các vấn đề liên quan