diff --git a/rdg.go b/rdg.go
index 1ef0016deef0c84088f81d372b1f2fd81fee8a7f..6e4594694b3cca717d4fbe1bd611a1221b881075 100644
--- a/rdg.go
+++ b/rdg.go
@@ -619,6 +619,8 @@ func DecodeUTF16(b []byte) (string, error) {
 		return "", fmt.Errorf("must have even length byte slice")
 	}
 
+	b, _ = dropCR(b)
+	
 	u16s := make([]uint16, 1)
 	ret := &bytes.Buffer{}
 	b8buf := make([]byte, 4)
@@ -633,3 +635,42 @@ func DecodeUTF16(b []byte) (string, error) {
 
 	return ret.String(), nil
 }
+
+// UTF-16 endian byte order
+const (
+	unknownEndian = iota
+	bigEndian
+	littleEndian
+)
+
+// dropCREndian drops a terminal \r from the endian data.
+func dropCREndian(data []byte, t1, t2 byte) []byte {
+	if len(data) > 1 {
+		if data[len(data)-2] == t1 && data[len(data)-1] == t2 {
+			return data[0 : len(data)-2]
+		}
+	}
+	return data
+}
+
+// dropCRBE drops a terminal \r from the big endian data.
+func dropCRBE(data []byte) []byte {
+	return dropCREndian(data, '\x00', '\r')
+}
+
+// dropCRLE drops a terminal \r from the little endian data.
+func dropCRLE(data []byte) []byte {
+	return dropCREndian(data, '\r', '\x00')
+}
+
+// dropCR drops a terminal \r from the data.
+func dropCR(data []byte) ([]byte, int) {
+	var endian = unknownEndian
+	switch ld := len(data); {
+	case ld != len(dropCRLE(data)):
+		endian = littleEndian
+	case ld != len(dropCRBE(data)):
+		endian = bigEndian
+	}
+	return data, endian
+}