mirror of
https://github.com/golang/go
synced 2024-11-19 15:44:44 -07:00
encoding/csv: preserve \r\n in quoted fields
The parser mistakenly assumed it could always fold \r\n into \n, which is not true since a \r\n inside a quoted fields has no special meaning and should be kept as is. Fix this by not folding \r\n to \n inside quotes fields. Fixes #21201 Change-Id: Ifebc302e49cf63e0a027ee90f088dbc050a2b7a6 Reviewed-on: https://go-review.googlesource.com/52810 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
f9cf8e5ab1
commit
9fbc06e6aa
@ -233,6 +233,13 @@ func (r *Reader) readRune() (rune, error) {
|
||||
return r1, err
|
||||
}
|
||||
|
||||
// readRawRune works the same way as readRune, but does not fold \r\n to \n.
|
||||
func (r *Reader) readRawRune() (rune, error) {
|
||||
r1, _, err := r.r.ReadRune()
|
||||
r.column++
|
||||
return r1, err
|
||||
}
|
||||
|
||||
// skip reads runes up to and including the rune delim or until error.
|
||||
func (r *Reader) skip(delim rune) error {
|
||||
for {
|
||||
@ -351,7 +358,9 @@ func (r *Reader) parseField() (haveField bool, delim rune, err error) {
|
||||
// quoted field
|
||||
Quoted:
|
||||
for {
|
||||
r1, err = r.readRune()
|
||||
// use readRawRune instead of readRune to preserve \r\n
|
||||
// in quotes fields.
|
||||
r1, err = r.readRawRune()
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
if r.LazyQuotes {
|
||||
|
@ -284,6 +284,13 @@ x,,,
|
||||
Line: 2,
|
||||
Column: 2,
|
||||
},
|
||||
{ // issue 21201
|
||||
Name: "CRLFInQuotedField",
|
||||
Input: "\"Hello\r\nHi\"",
|
||||
Output: [][]string{
|
||||
{"Hello\r\nHi"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func TestRead(t *testing.T) {
|
||||
|
Loading…
Reference in New Issue
Block a user