@@ -1363,8 +1363,55 @@ func supportsSmartQuotes(enc encoding.Encoding) bool {
13631363return false
13641364}
13651365
1366+ func replaceUnsupportedCharacters (data []byte , length int ) []byte {
1367+ if len (data ) == 0 {
1368+ return data
1369+ }
1370+
1371+ var content []byte
1372+ var prefix []byte
1373+ var contentLength int
1374+ var prefixLen int
1375+
1376+ if length > 255 {
1377+ // 2-byte length prefix (LittleEndian)
1378+ prefixLen = 2
1379+ contentLength = int (binary .LittleEndian .Uint16 (data [:2 ]))
1380+ if contentLength > len (data )- prefixLen {
1381+ contentLength = len (data ) - prefixLen
1382+ }
1383+ content = data [prefixLen : prefixLen + contentLength ]
1384+ } else {
1385+ // 1-byte length prefix
1386+ prefixLen = 1
1387+ contentLength = int (data [0 ])
1388+ if contentLength > len (data )- prefixLen {
1389+ contentLength = len (data ) - prefixLen
1390+ }
1391+ content = data [prefixLen : prefixLen + contentLength ]
1392+ }
1393+
1394+ // Replace unsupported characters
1395+ content = normalizeSmartQuotes (content )
1396+
1397+ // Rebuild prefix with new length
1398+ if prefixLen == 2 {
1399+ prefix = make ([]byte , 2 )
1400+ binary .LittleEndian .PutUint16 (prefix , uint16 (len (content )))
1401+ } else {
1402+ prefix = []byte {byte (len (content ))}
1403+ }
1404+
1405+ return append (prefix , content ... )
1406+ }
1407+
13661408func decodeStringWithEncoder (data []byte , length int , enc encoding.Encoding ) (v string , n int ) {
1409+ // Define the Latin1 decoder
13671410decoder := enc .NewDecoder ()
1411+ if ! supportsSmartQuotes (enc ) {
1412+ data = replaceUnsupportedCharacters (data , length )
1413+ }
1414+
13681415if length < 256 {
13691416// If the length is smaller than 256, extract the length from the first byte
13701417length = int (data [0 ])
0 commit comments