--- layout: default title: CSV document charset encoding --- # BOM and CSV encoding Depending on the software you are using to read your CSV you may need to adjust the CSV document outputting script.

To work as intended you CSV object needs to support the stream filter API

## MS Excel on Windows On Windows, MS Excel, expects an UTF-8 encoded CSV with its corresponding `BOM` character. To fulfill this requirement, you simply need to add the `UTF-8` `BOM` character if needed as explained below: ```php use League\Csv\Reader; $reader = Reader::createFromPath('/path/to/my/file.csv', 'r'); //let's set the output BOM $reader->setOutputBOM(Reader::BOM_UTF8); //let's convert the incoming data from iso-88959-15 to utf-8 $reader->addStreamFilter('convert.iconv.ISO-8859-15/UTF-8'); //BOM detected and adjusted for the output echo $reader->getContent(); ```

The conversion is done with the iconv extension using its bundled stream filters.

## MS Excel on MacOS On a MacOS system, MS Excel requires a CSV encoded in `UTF-16 LE` using the `tab` character as delimiter. Here's an example on how to meet those requirements using the `League\Csv` package. ```php use League\Csv\CharsetConverter; use League\Csv\Reader; use League\Csv\Writer; //the current CSV is ISO-8859-15 encoded with a ";" delimiter $origin = Reader::createFromPath('/path/to/french.csv', 'r'); $origin->setDelimiter(';'); //let's use stream resource $writer = Writer::createFromStream(fopen('php://temp', 'r+')); //let's set the output BOM $writer->setOutputBOM(Reader::BOM_UTF16_LE); //we set the tab as the delimiter character $writer->setDelimiter("\t"); //let's convert the incoming data from iso-88959-15 to utf-16 CharsetConverter::addTo($writer, 'ISO-8859-15', 'UTF-16'); //we insert csv data $writer->insertAll($origin); //all is good let's output the results $writer->output('mycsvfile.csv'); ```

The conversion is done with the mb_string extension using the League\Csv\CharsetConverter.