Bug #72330 [Csd->ReO]: CSV fields incorrectly split if escape char followed by UTF chars

From: Date: Mon, 09 Apr 2018 21:30:59 +0000
Subject: Bug #72330 [Csd->ReO]: CSV fields incorrectly split if escape char followed by UTF chars
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-214671@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72330&edit=1 ID: 72330 Updated by: cmb@php.net Reported by: cronfy at gmail dot com Summary: CSV fields incorrectly split if escape char followed by UTF chars -Status: Closed +Status: Re-Opened Type: Bug Package: Strings related Operating System: Linux Mint 17.1 Rebecca PHP Version: Irrelevant Assigned To: cmb Block user comment: N Private report: N Previous Comments: ------------------------------------------------------------------------ [2018-04-09 18:21:44] ganlvtech at qq dot com Related To: Bug #72330 ------------------------------------------------------------------------ [2018-04-09 18:21:41] ganlvtech at qq dot com str_getcsv not correctly work with qouted multibyte character PHP version: 7.2.2 Operating system: Windows 10 zh-CN Description: ------------ str_getcsv not correctly work with qouted multibyte characters. When the multibyte characters are simply seperated by comma, everything seems ok. If the value contains a quotation mark("), I need to escape quotation mark by doubled quotation mark(""), and quote the value with a pair of quotation mark. And when I try to decode the csv string by str_getcsv, this value will combined with next value (I lost a column and got two value together in one column). There is not just one type of wrong result. But I think every type of wrong result be caused by the escaped quotation mark. Bug #72330: CSV fields incorrectly split if escape char followed by UTF chars Test script: --------------- <?php // Test 1 $data = [ "\xE4\xBD\xA0\xE5\xA5\xBD", // 你好 "\xE4\xB8\x96\xE7\x95\x8C", // 世界 ]; $encoded = implode(',', array_map(function ($value) { return '"' . str_replace('"', '""', $value) . '"'; }, $data)); var_dump(str_getcsv($encoded) === $data); // Test 2 $data = [ "\"\xE5\x95\x8A", // "啊 ]; $encoded = str_putcsv($data); var_dump(str_getcsv($encoded) === $data); /** @link https://bugs.php.net/bug.php?id=64183 */ function str_putcsv($fields, $delimiter = ',', $enclosure = '"', $escape_char = '\\') { $stream = fopen('php://memory', 'w+'); fputcsv($stream, $fields, $delimiter, $enclosure, $escape_char); rewind($stream); return stream_get_contents($stream); } Expected result: ---------------- bool(true) bool(true) Actual result: -------------- bool(false) bool(false) ------------------------------------------------------------------------ [2016-10-17 10:10:46] bwoebi@php.net Automatic comment on behalf of cmb Revision: http://git.php.net/?p=php-src.git;a=commit;h=f2c2a4be9e466f14677089efe33e20ca0b146809 Log: Fix #72330: CSV fields incorrectly split if escape char followed by UTF chars ------------------------------------------------------------------------ [2016-07-21 17:13:41] cmb@php.net Automatic comment on behalf of cmb Revision: http://git.php.net/?p=php-src.git;a=commit;h=f2c2a4be9e466f14677089efe33e20ca0b146809 Log: Fix #72330: CSV fields incorrectly split if escape char followed by UTF chars ------------------------------------------------------------------------ [2016-07-21 16:13:58] cmb@php.net This issue does not only affect str_getcsv(), but also other CSV reading functions, so I've changed the bug title. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=72330 -- Edit this bug report at https://bugs.php.net/bug.php?id=72330&edit=1

« previous php.bugs (#214671) next »