Current Location: Home> Latest Articles> How to Resolve Encoding Issues When Using fgetcsv to Read CSV Files? A Detailed Guide on Handling Encoding Problems

How to Resolve Encoding Issues When Using fgetcsv to Read CSV Files? A Detailed Guide on Handling Encoding Problems

gitbox 2025-06-08

1. Why Does fgetcsv Cause Garbled Text?

fgetcsv() is a convenient PHP function used to read CSV files line by line and return the data in array format. However, it does not automatically perform encoding conversions. If you attempt to read a file saved with GBK or BIG5 encoding while your PHP environment or webpage output is UTF-8, the output may appear as garbled text.


2. The Core Solution to Garbled Text: Encoding Conversion

To resolve the garbled text issue, you need to convert the encoding of each line from the original encoding to the target encoding (usually UTF-8) after reading it. This is typically done using PHP’s mb_convert_encoding() or iconv() functions.


3. Full Code Example

Suppose we have a CSV file encoded in GBK, and we want to display its contents correctly in UTF-8. The following code can be used:

<?php

$filename = "data.csv"; // Assuming the CSV file is in GBK encoding
$handle = fopen($filename, "r");

if ($handle !== false) {
while (($data = fgetcsv($handle)) !== false) {
// Convert each column from GBK to UTF-8
foreach ($data as &$field) {
$field = mb_convert_encoding($field, "UTF-8", "GBK");
}
unset($field); // Prevent reference issues

    print_r($data); // Output the converted content
}
fclose($handle);

} else {
echo "Unable to open file: $filename";
}

?>


4. Automatically Detect Encoding (Advanced Approach)

If you're unsure about the file’s original encoding, you can use mb_detect_encoding() to automatically detect it:

<?php

$filename = "data.csv";
$handle = fopen($filename, "r");

if ($handle !== false) {
$firstLine = fgets($handle);
rewind($handle); // Reset the file pointer after reading the first line
$encoding = mb_detect_encoding($firstLine, ["GBK", "UTF-8", "BIG5", "SJIS"], true);
if (!$encoding) {
$encoding = "GBK"; // Default to GBK if encoding cannot be detected
}

while (($data = fgetcsv($handle)) !== false) {
    foreach ($data as &$field) {
        $field = mb_convert_encoding($field, "UTF-8", $encoding);
    }
    unset($field);
    print_r($data);
}
fclose($handle);

} else {
echo "File cannot be opened";
}

?>


5. What If the CSV Is Uploaded Through the Browser?

If a user uploads a CSV file that might come from different operating systems (Windows, Mac, Linux) or different software (Excel, WPS), the character encoding can become unpredictable. It is recommended to standardize the encoding after uploading and before reading the file with fgetcsv().

You can save the uploaded CSV file as a temporary file and then apply the aforementioned automatic detection and encoding conversion method:

<?php

if (isset($_FILES['csvfile']) && $_FILES['csvfile']['error'] === UPLOAD_ERR_OK) {
$tmpFile = $_FILES['csvfile']['tmp_name'];
$handle = fopen($tmpFile, "r");

if ($handle !== false) {
    $firstLine = fgets($handle);
    rewind($handle);
    $encoding = mb_detect_encoding($firstLine, ["GBK", "UTF-8", "BIG5", "SJIS"], true);
    if (!$encoding) {
        $encoding = "GBK";
    }
<pre class="overflow-visible!"><div class="contain-inline-size rounded-2xl border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-2xl">php</div><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><button class="flex gap-1 items-center select-none py-1" aria-label="复制"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="icon-xs"><path fill-rule="evenodd" clip-rule="evenodd" d="M7 5C7 3.34315 8.34315 2 10 2H19C20.6569 2 22 3.34315 22 5V14C22 15.6569 20.6569 17 19 17H17V19C17 20.6569 15.6569 22 14 22H5C3.34315 22 2 20.6569 2 19V10C2 8.34315 3.34315 7 5 7H7V5ZM9 7H14C15.6569 7 17 8.34315 17 10V15H19C19.5523 15 20 14.5523 20 14V5C20 4.44772 19.5523 4 19 4H10C9.44772 4 9 4.44772 9 5V7ZM5 9C4.44772 9 4 9.44772 4 10V19C4 19.5523 4.44772 20 5 20H14C14.5523 20 15 19.5523 15 19V10C15 9.44772 14.5523 9 14 9H5Z" fill="currentColor"></path></svg>复制</button><button class="flex items-center gap-1 py-1 select-none"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="icon-xs"><path d="M2.5 5.5C4.3 5.2 5.2 4 5.5 2.5C5.8 4 6.7 5.2 8.5 5.5C6.7 5.8 5.8 7 5.5 8.5C5.2 7 4.3 5.8 2.5 5.5Z" fill="currentColor" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M5.66282 16.5231L5.18413 19.3952C5.12203 19.7678 5.09098 19.9541 5.14876 20.0888C5.19933 20.2067 5.29328 20.3007 5.41118 20.3512C5.54589 20.409 5.73218 20.378 6.10476 20.3159L8.97693 19.8372C9.72813 19.712 10.1037 19.6494 10.4542 19.521C10.7652 19.407 11.0608 19.2549 11.3343 19.068C11.6425 18.8575 11.9118 18.5882 12.4503 18.0497L20 10.5C21.3807 9.11929 21.3807 6.88071 20 5.5C18.6193 4.11929 16.3807 4.11929 15 5.5L7.45026 13.0497C6.91175 13.5882 6.6425 13.8575 6.43197 14.1657C6.24513 14.4392 6.09299 14.7348 5.97903 15.0458C5.85062 15.3963 5.78802 15.7719 5.66282 16.5231Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path><path d="M14.5 7L18.5 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>编辑</button></div></div></div><div class="overflow-y-auto p-4" dir="ltr">while (($data = fgetcsv($handle)) !== false) {
    foreach ($data as &$field) {
        $field = mb_convert_encoding($field, "UTF-8", $encoding);
    }
    unset($field);
    print_r($data);
}
fclose($handle);

} else {
echo "Unable to read the uploaded file";
}

} else {
echo "Upload failed or file is invalid";
}

?>