mirror of
https://github.com/golang/go
synced 2024-11-19 15:54:46 -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
|
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.
|
// skip reads runes up to and including the rune delim or until error.
|
||||||
func (r *Reader) skip(delim rune) error {
|
func (r *Reader) skip(delim rune) error {
|
||||||
for {
|
for {
|
||||||
@ -351,7 +358,9 @@ func (r *Reader) parseField() (haveField bool, delim rune, err error) {
|
|||||||
// quoted field
|
// quoted field
|
||||||
Quoted:
|
Quoted:
|
||||||
for {
|
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 != nil {
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
if r.LazyQuotes {
|
if r.LazyQuotes {
|
||||||
|
@ -284,6 +284,13 @@ x,,,
|
|||||||
Line: 2,
|
Line: 2,
|
||||||
Column: 2,
|
Column: 2,
|
||||||
},
|
},
|
||||||
|
{ // issue 21201
|
||||||
|
Name: "CRLFInQuotedField",
|
||||||
|
Input: "\"Hello\r\nHi\"",
|
||||||
|
Output: [][]string{
|
||||||
|
{"Hello\r\nHi"},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRead(t *testing.T) {
|
func TestRead(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user